选择+复制TextView中的文本?


106

有没有一种方法可以允许用户在TextView中选择/复制文本?我需要EditText的相同功能,您可以长按该控件并获得全选/复制的弹出选项,但是我需要该控件看起来像TextView。

尝试了一些操作,例如使EditText使用editable =“ none”选项或inputType =“ none”,但这些操作仍保留了EditText的框架背景,我不希望这样,

谢谢

-------更新----------------------

那里是99%,我想要的是使选择光亮可见(橙色的东西)。除此之外,尽管如此,还是可以忍受的:

<EditText 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:editable="false"
  style="?android:attr/textViewStyle"
  android:textColor="@color/white"
  android:textAppearance="@android:style/TextAppearance.Medium"
  android:cursorVisible="false"
  android:background="@null" />

我猜这是由于cursorVisible =“ false”引起的,但即使没有进行任何选择,光标也不会存在。


一种替代方法是使用WebView代替TextView来显示文本。
aleb


Answers:


221

android:textIsSelectable有效(至少在ICS中-我尚未在较早版本中签入)

<TextView
    android:id="@+id/deviceIdTV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"
    android:text="" />

15
仅API 11级及更高
Thierry-Dimitri Roy

10
但是如何复制?我可以突出显示文本,但没有出现复制菜单。
Bagusflyer 2014年

1
当您摆弄光标时,这不是导致崩溃的原因吗?
Shubham

1
您能让我知道如何使其在Listview中工作吗?
Ramesh Kumar

在工具栏上创建的漂亮甚至默认的复印菜单
Farid

56

文本视图需要启用,可聚焦,longClickable和textIsSelectable

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:id="@+id/pwTextView"
    android:enabled="true"
    android:textIsSelectable="true"
    android:focusable="true"
    android:longClickable="true" />

1
这是最好的解决方案。
2016年

9
为什么textIsSelectable还不够?只有这种选择
才对

4
或者您可以textview.setTextIsSelectable(true)在代码中使用Java代码。
berrytchaks

1
只是用textIsSelectableis为我做这份工作
crgarridos 18'Apr

1
以某种方式,它textIsSelectable在某些情况下有效,但在其他情况下则无效。有时,相同的布局并不总是仅适用于textIsSelectable,而是适用于不同的文本。但是,此解决方案似乎并未使其更好地工作,因此问题可能出在其他地方。
西蒙·尼农

23

我认为我有更好的解决方案。刚打电话
registerForContextMenu(yourTextView);

并且您TextView将被注册接收上下文菜单事件。

然后onCreateContextMenu在您的Activity

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    //user has long pressed your TextView
    menu.add(0, v.getId(), 0, "text that you want to show in the context menu - I use simply Copy");

    //cast the received View to TextView so that you can get its text
    TextView yourTextView = (TextView) v;

    //place your TextView's text in clipboard
    ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
    clipboard.setText(yourTextView.getText());
}

希望这对您和其他任何寻求从文本复制文本的方法有帮助的人 TextView


用户在哪里可以选择复制哪些文本?它不只是复制所有内容,这不是原始问题吗?
James Moore

4
可能需要注意的是,这将导致立即复制文本,无论他们是否从菜单中选择“复制”。为了仅在选择了适当的项目时进行复制,您还需要覆盖onContextItemSelected()或向菜单项添加单击处理程序。
Faisal,

ClipboardManager.setText(CharSequence text)已在API级别11中弃用。setPrimaryClip(ClipData)改为使用。这将创建一个保存给定文本的ClippedItem并将其设置为主剪辑。它没有标签或图标。好的有关复制粘贴的文章:链接
Marilia

我想在选择文本后打开对话框。那么您可以提供任何建议吗?
阿南德·萨瓦尼

9
textview1.setTextIsSelectable(true);

这样一来,用户就可以通过长按或通常选择并复制文本


6

我正在尝试实现相同的功能,您的问题帮助我正确设置了我的editext布局。那谢谢啦!:)

然后我意识到,如果光标处于打开状态,则高光实际上是可见的。但是我就像您不想在长按文本之前看到光标一样,所以我像您一样将光标隐藏在layout.xml文件中,并添加了一个事件监听器以长按并仅在选择开始时才显示光标。

因此,在onCreate部分的Activity中添加侦听器:

public TextView htmltextview;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    htmltextview.setOnLongClickListener(new OnLongClickListener(){

        public boolean onLongClick(View v) {
            htmltextview.setCursorVisible(true);
            return false;
        }
    });

}

而且,在开始时没有光标,如果长按,则光标会显示选择边界。

希望我能帮上忙。

干杯,FM


5

我也在尝试做类似的事情,但是仍然需要一种自定义方法来处理TextView中文本的突出显示。我触发了亮点并复制了LongClick动作。

这是我使用SpannableString以下方法进行管理的方式:

SpannableString highlightString = new SpannableString(textView.getText());
highlightString.setSpan(new BackgroundColorSpan(ContextCompat.getColor(getActivity(), R.color.gray))
            , 0, textView.getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(highlightString);
copyToClipboard(urlToShare);

和复制功能:

public void copyToClipboard(String copyText) {
    ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
    ClipData clip = ClipData.newPlainText("url", copyText);
    clipboard.setPrimaryClip(clip);
    Toast toast = Toast.makeText(getActivity(), "Link is copied", Toast.LENGTH_SHORT);
    toast.show();
}

我希望这对最终解决此问题的人有所帮助:)


4

以编程方式使用Kotlin(手动副本)

button.setTextIsSelectable(true)

或者,添加Kotlin属性扩展

var TextView.selectable
    get() = isTextSelectable
    set(value) = setTextIsSelectable(value)

然后打电话

textview.selectable = true
// or
if (textview.selectable) { ...

以编程方式使用Kotlin(自动复制)

如果要在用户长按查看时自动复制,这是所需的基本代码:

myView.setOnLongClickListener {  
    val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
    val clip = ClipData.newPlainText("Copied String", myString)
    clipboardManager.setPrimaryClip(clip)
    true // Or false if not consumed
}

您可能要添加一个Toast以确认它发生了

或者,添加Kotlin扩展功能

myView.copyOnHold() // pass custom string to not use view contents

fun TextView.copyOnHold(customText: String? = null) {
    setOnLongClickListener {
        val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
        val clip = ClipData.newPlainText("Copied String", customText ?: text)
        clipboardManager.setPrimaryClip(clip)
        true // Or false if not consumed
    }
}

使用Xml(手动复制)

将此添加到您的 <TextView>

android:textIsSelectable="true"

注意:所有这些都需要android:enabled="true"android:focusable="true",这是的默认值TextView


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.