用于TextView的Android TextView空白区域长按上下文菜单,而不是文本选择菜单

Posted

技术标签:

【中文标题】用于TextView的Android TextView空白区域长按上下文菜单,而不是文本选择菜单【英文标题】:Android TextView empty area long-touch context menu for TextView, not text selection menu 【发布时间】:2021-10-12 12:38:53 【问题描述】:

似乎在启用了文本选择的TextView 上,如果我长按空白区域,则会选择最近的单词并显示文本选择上下文菜单。是否可以更改此设置,并为 TextView 本身显示不同的上下文菜单,而不选择最近的单词?

我的意思是:长按某个单词会显示所选单词的上下文菜单(例如“复制/剪切/全选”),长按空白区域会显示 @ 的上下文菜单987654325@(类似于“重新加载页面”)。


PS:人们似乎并不理解“空白空间”。用黄线标记的区域就是我的意思。

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_>
    <ScrollView
            android:layout_
            android:layout_>
            <TextView
                    android:id="@+id/textview1"
                    android:layout_
                    android:layout_
                    android:background="#FF0000"
                    android:text="@string/large_text"
                    android:textAppearance="@style/TextAppearance.AppCompat.Large"
                    android:textColor="@color/black"
                    android:textIsSelectable="true" />
    </ScrollView>
</RelativeLayout>

【问题讨论】:

你所说的“空白区域”到底是什么意思,你能提供一些解释或图片吗?它是单词之间、行之间或文本周围的区域? 我想我明白你在找什么,你可以用TextView + View 来做,使TextView 宽度wrap_content,所以如果用户长按空白区域(在本例中为查看)显示您的菜单 我只是指我们看到的视觉空白区域。从技术上讲,我可以在单词之间或两个段落之间的空行,但是我添加的屏幕截图顶部的“材料隐喻”和“是”之间的空格在视觉上是不同的。 【参考方案1】:

您可以使用TextView + View 来实现,这是一个示例:

XML:

<RelativeLayout
    android:layout_
    android:layout_>

    <View
        android:id="@+id/emptyArea"
        android:layout_
        android:layout_ />

    <TextView
        android:id="@+id/text"
        android:layout_
        android:layout_
        android:layout_margin="10dp"
        android:text="Some text"
        android:textColor="@color/black"
        android:textIsSelectable="true"
        android:textSize="20sp"
        android:textStyle="bold" />

</RelativeLayout>

Java:

 findViewById(R.id.emptyArea).setOnLongClickListener(v -> 
            Toast.makeText(getApplicationContext(), "On emptyArea clicked", Toast.LENGTH_SHORT).show();
            return true;
        );

或者您可以使用setCustomSelectionActionModeCallback()

TextView textView = findViewById(R.id.text);
        textView.setCustomSelectionActionModeCallback(new ActionMode.Callback() 
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) 

                return false;
            

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) 
                return false;
            

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) 
                return false;
            

            @Override
            public void onDestroyActionMode(ActionMode mode) 

            
        );

请注意,由于某种原因,setCustomSelectionActionModeCallback 是带有 MIUI(小米设备)的not working。

【讨论】:

以上是关于用于TextView的Android TextView空白区域长按上下文菜单,而不是文本选择菜单的主要内容,如果未能解决你的问题,请参考以下文章

安卓怎么设置textview内容

Android 怎么让TextView中的文本居于右下方

使 android-textview 的某个部分向右对齐

在 ImageView 中放置许多 TextView

Android中的文本/布局对齐(textAlignment,gravity)

在其他活动中更改 TextView