在TextView中选择+复制文本?

use*_*701 91 android

有没有办法允许用户在TextView中选择/复制文本?我需要EditText的相同功能,你可以长按控件并获得select all/copy的弹出选项,但我需要控件看起来像TextView.

试着喜欢做一个EditText使用编辑="无"选项或的inputType ="无"的几件事情,但那些仍然保留一个EditText,这是我不希望的框架背景下,

谢谢

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

这是99%,我想要的是选择hilight是可见的(橙色的东西).除此之外,它可以忍受这个:

<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" />
Run Code Online (Sandbox Code Playgroud)

我猜它是由于cursorVisible ="false"引起的,但没有它,即使没有做出任何选择,光标仍然存在.

Mil*_*ind 198

android:textIsSelectable有效(至少在ICS中 - 我还没有在早期版本中检查过)

<TextView
    android:id="@+id/deviceIdTV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true"
    android:text="" />
Run Code Online (Sandbox Code Playgroud)

  • API级别11及以上 (15认同)
  • 但如何复制?我可以突出显示文本,但没有出现复制菜单. (10认同)

小智 42

需要启用Text View,focusable,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" />
Run Code Online (Sandbox Code Playgroud)

  • 为什么`textIsSelectable`还不够?它只适用于我这个选项 (8认同)
  • 或者,您可以在代码Java代码中使用`textview.setTextIsSelectable(true)`。 (2认同)

pan*_*dre 21

我想我有更好的解决方案.打电话吧
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());
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助您和其他任何人寻找一种方法来复制文本 TextView

  • 值得注意的是,这会导致文本立即被复制,无论他们是否从菜单中选择"复制".为了仅在选择了适当的项目时进行复制,您还需要覆盖onContextItemSelected(),或者向菜单项添加单击处理程序. (4认同)

Ami*_*toj 8

textview1.setTextIsSelectable(true);
Run Code Online (Sandbox Code Playgroud)

这将使用户能够在长按或正常情况下选择和复制文本


Gib*_*olt 6

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

button.setTextIsSelectable(true)
Run Code Online (Sandbox Code Playgroud)

或者,添加 Kotlin 属性扩展

var TextView.selectable
    get() = isTextSelectable
    set(value) = setTextIsSelectable(value)
Run Code Online (Sandbox Code Playgroud)

然后打电话

textview.selectable = true
// or
if (textview.selectable) { ...
Run Code Online (Sandbox Code Playgroud)

以编程方式使用 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
}
Run Code Online (Sandbox Code Playgroud)

您可能需要添加一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 XML(手动复制)

将此添加到您的 <TextView>

android:textIsSelectable="true"
Run Code Online (Sandbox Code Playgroud)

注意:所有这些都需要android:enabled="true"android:focusable="true",它们是TextView.


小智 5

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

然后我意识到,如果光标打开,高亮显示实际上是可见的.但我只是喜欢你不想在长按文本之前看到光标,所以我将光标隐藏在layout.xml文件中,就像你一样,并添加了一个eventlistener进行长时间点击并仅在选择开始时显示光标.

所以在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;
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

并且,开头没有光标,如果长按,光标将显示选择边界.

我希望我能帮忙.

干杯,私奔


Wah*_*Haq 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);
Run Code Online (Sandbox Code Playgroud)

和复制功能:

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();
}
Run Code Online (Sandbox Code Playgroud)

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