代码之家  ›  专栏  ›  技术社区  ›  tm1701

Android-on-RecyclerView with textview items,如何同时拥有onLongPress菜单和选择copy text?

  •  0
  • tm1701  · 技术社区  · 6 年前

    我的应用程序包含一个包含TextView项目的回收视图。在每个TextView项上,我都定义了一些功能,比如将文本共享给另一个应用程序。

    如何将onLongPress或onCreateContextMenu与(启用)select and copy text结合起来?可以从上下文菜单中启用选择和复制文本。

    我当然可以用for 选择文本 冲突 文本视图项上的长按(上下文)菜单。

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

    当然,我希望在选择复制文本后返回上下文菜单。

    这个功能是否可行?对。对于应用程序来说,这是必不可少的。我在其他应用程序中也看到过;-)

    0 回复  |  直到 6 年前
        1
  •  1
  •   tm1701    6 年前

    下面的解决方案在大多数情况下都对我有帮助。

    初始设置文本字段上的手势:

    • 用你的手势在文本视图上设置一个onTouchListener。
    • 允许其中一个手势切换到文本选择模式。见下文。

    如何以编程方式设置文本选择?

    • 将textIsSelectable、focusable、longPressable设置为true
    • 在textview上安装一个clickListener,允许您切换回原始的TouchListener。

    1) 安装你的手势处理程序:

    // Create your Touch Listener  
    onTouchListener = new OnSwipeTouchListener(mCtx, this);
    view.setOnTouchListener( onTouchListener);
    

    2) 切换到文本选择模式:

    // Create your popup with an menu option to switch to textselection modus:
    PopupMenu popup = new PopupMenu(mCtx, view);
    popup.inflate(R.menu.text_options_menu);
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch (item.getItemId()) {
                case ...
                case R.id.text_textisselectable:
                    view.setOnTouchListener(null);
                    ((TextView)view).setTextIsSelectable( true);
                    ((TextView)view).setFocusable( true);
                    ((TextView)view).setLongClickable( true);
                    // Install a click listener to switch back to the previous Touch Listener
                    ((TextView)view).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            PopupMenu popupx = new PopupMenu(mCtx, view);
                            popupx.inflate(R.menu.selecttext_back_menu);
                            popupx.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                                @Override
                                public boolean onMenuItemClick(MenuItem item) {
                                    ((TextView)view).setTextIsSelectable( false);
                                    ((TextView)view).setFocusable( false);
                                    ((TextView)view).setLongClickable( false);
                                    view.setOnTouchListener(onTouchListener);
                                    return true;
                                }});
                                popupx.show();
                            }
                        });
                    break;