【问题标题】:Copy text from TextView on Android从 Android 上的 TextView 复制文本
【发布时间】:2010-06-01 20:03:53
【问题描述】:

我有一个ListView,其中每个项目都是一个TextView

我想启用类似于EditText 的长按行为,它显示默认上下文菜单,其中包含“全选”、“全部剪切”、“全部复制”等项目。

有没有一种简单的方法可以为TextView 启用此功能?

【问题讨论】:

  • 目前我正在注册上下文菜单并使用剪贴板管理器复制 TextView 的整个文本。但似乎应该有一个默认的方式来做到这一点。
  • 实际上,上下文菜单就是为此而调整的。您可以在闲暇时对其进行自定义。您还可以查看 AlertDialog 类。它通常不用于此目的,但您可以通过长按来调用它。但是,如果我没记错的话,您最多只能使用 3 个按钮。
  • 还有一件事,我不知道这样做是否可取,但您可以尝试将列表视图放在框架布局中并在其中添加另一个视图/布局但可见性消失,然后转当单击列表中的元素并更新其内容时,它是否可见?
  • 你是怎么解决这个问题的?

标签: android select copy contextmenu textview


【解决方案1】:

我想我有一个解决办法。 只需致电
registerForContextMenu(yourTextView);

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

然后在您的Activity 中覆盖onCreateContextMenu

@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 复制文本的方法的人

【讨论】:

  • 感谢您的帖子,这正是 API 级别 2.1 所需要的。起初它不起作用,发现我必须从清单 xml 中删除它:android:configChanges="keyboardHidden"
  • 它确实有效。尽管它在用户实际单击复制之前复制文本。这可能会造成混淆并覆盖他们的剪贴板。另一种方法是在 onContextItemSelected 中执行复制。您已经将菜单选项 id 设置为视图 id,但没有使用它。此外,如果您的目标是设备 ,请确保在此示例中导入 android.text.ClipboardManager 而不是 android.content.ClipboardManager
  • 如何只在菜单项被点击时复制?
【解决方案2】:

实际上,您不必自己开发此功能。您只需要使用 EditText 而不是 TextView,同时将 EditText 的 android:editable 设置为 false。我的代码在这里:

R.layout.edittext.xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="40dip"
android:editable="false" 
android:background="@null"
android:textColor="#FFFFFF"/>

ListItemCopyTextActivity.java

public class ListItemCopyTextActivity extends Activity {    

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LinearLayout ll = new LinearLayout(this);
    ListView lv = new ListView(this);

    String[] values = new String[15];
    for (int i = 0; i < 15; i++) {
        values[i] = "ListItem NO." + i;
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.edittext, values);
    lv.setAdapter(adapter);

    ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

    setContentView(ll);

    }
}

您只需长按该项目,然后选择选择文本、复制、剪切、粘贴等。

【讨论】:

  • 对我不起作用。如果可编辑为假,我会得到“TextView 不支持文本选择。操作模式已取消。”使用 android:textIsSelectable 对我来说是一个很好的解决方案。
【解决方案3】:

为了允许用户复制部分或全部 TextView 的值并将其粘贴到其他位置,

将 XML 属性 {@link android.R.styleable#TextView_textIsSelectable android:textIsSelectable} 设置为 "true"

致电{@link #setTextIsSelectable setTextIsSelectable(true)}

【讨论】:

  • 这是唯一最简单最正确的解决方案。谢谢。
【解决方案4】:

您可能希望在 ListView 上注册一个 onItemLongClickListener,然后根据所选项目,为用户提供您选择的任何选项。

【讨论】:

    【解决方案5】:

    我有一个解决方案,但我并不完全有用。

    就用这个方法吧:

    txtDescDetail.setCursorVisible(true);
    

    我希望这样做。

    【讨论】:

      【解决方案6】:

      解决办法

       <TextView
              android:id="@+id/textID"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginTop="10dp"
              android:clickable="true"
              android:focusable="true"
              android:text="Terms and Conditions"
              app:layout_constraintBottom_toBottomOf="parent"
              app:layout_constraintEnd_toEndOf="parent"
              app:layout_constraintHorizontal_bias="0.5"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toTopOf="parent" />
      

      覆盖setOnLongClickListener

      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)
          textID.setTextIsSelectable(true)
          textID. setOnLongClickListener {
             val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
             val clip = ClipData.newPlainText("Copied String",  textID.text)
             clipboardManager.setPrimaryClip(clip)
             true // Or false if not consumed
         }
      }
      

      预期的行为将如下图所示

      【讨论】:

      • 只需将:android:textIsSelectable="true" 添加到您的 TextView 布局中。够安静的!无需其他布局更改或代码行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2023-03-13
      • 2016-06-26
      相关资源
      最近更新 更多