Edittext 在长按时进行选择但不显示上下文菜单?

Posted

技术标签:

【中文标题】Edittext 在长按时进行选择但不显示上下文菜单?【英文标题】:Edittext that make selection on long click but do not show context menu? 【发布时间】:2016-03-31 05:21:17 【问题描述】:

我想提供剪切、复制文本的自定义处理程序。

定位到 Longclick

    不应出现上下文菜单。 可以使用跟踪器(或拖动器)选择文本。

[更新]

 protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    edittext = (EditText) findViewById(R.id.notetext);
    . . . .

    edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback()
    
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) 
            return false;
        

        public void onDestroyActionMode(ActionMode mode) 
        

        public boolean onCreateActionMode(ActionMode mode, Menu menu)
        
            return true;
        

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

  . . . .



@Override
public void onSupportActionModeStarted(android.support.v7.view.ActionMode mode) 
    super.onSupportActionModeStarted(mode);
    View v = new View(MainActivity.this);
    mode.setCustomView(v);
    mode.getMenu().clear();
    mode.getMenu().close();
    mode.finish();

使用上面的代码我可以删除全选、剪切、复制和粘贴。但它仍然显示“文本选择”

下图显示了所需的内容。

【问题讨论】:

【参考方案1】:

您想摆脱 ActionMode 吗?并创建自己的??

您可以覆盖它并在即将显示默认值时收到通知

  @Override
  public void onSupportActionModeStarted(ActionMode mode)      
    super.onSupportActionModeStarted(mode);
    //you can add your custom ui here
    mode.setCustomView(....);// it takes a view

如果你想关闭它,那么你可以打电话给mode.finish();,如果你不需要它,你可以在那里调用它来关闭它或完成它。

当它即将死去时,它会调用这个 onSupportActionModeFinished(ActionMode mode)` 我所说的方法是针对支持库的,希望你知道。

剩下的就是奶酪

【讨论】:

更新问题。请提出一些建议。 mode.finish() 有效,但看起来很丑,菜单出现并隐藏,整个视图抖动,选择不保留【参考方案2】:

我终于解决了这个问题。这个解决方案非常适合我。首先,您需要创建上下文菜单背景,如下所示

menuback.xml

<?xml version="1.0" encoding="utf-8"?>
  <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
      <shape android:shape="rectangle">
        <solid android:color="@android:color/transparent"/>
      </shape>
    </item>
  </selector>

然后按如下方式创建自定义菜单

我的菜单.xml

<?xml version="1.0" encoding="utf-8"?>
  <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/m" android:title=" " ></item>
  </menu>

现在在您的

上添加以下行

styles.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="actionModeBackground">@drawable/menuback</item>
    <item name="actionBarSize">1dp</item>
    <item name="android:actionModeCloseDrawable">@android:color/transparent</item>

</style>

</resources>

最后将actionbar的高度设置为0并实现ActionMode.CallBack如下

       EditText editText=findViewById(R.id.ed);

    getSupportActionBar().setElevation(0);
    editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() 
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) 
            mode.getMenu().clear();
            MenuInflater inflater=mode.getMenuInflater();
            inflater.inflate(R.menu.mymenu,menu);
            return true;
        

        @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) 

        
    );

Ta...da...这是最终结果

【讨论】:

以上是关于Edittext 在长按时进行选择但不显示上下文菜单?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用选择器在长按时“永久”突出显示 ListView 行,但在正常按下时短暂显示

Android webview 不应该在长按时显示操作栏

我想在长按时删除 ListView 上的项目

当用户在移动设备上长按时如何在 div 或输入字段中选择完整的文本

对于 iPhone - 但不是 iOS 模拟器 - UIToolbar UIBarButtonItem 将仅在长按时突出显示,而不是在点击时突出显示

如果嵌入在容器视图中,didSelectRowAtIndexPath 仅在长按时有效[重复]