使用Android + MIUI和setCustomSelectionActionModeCallback的设备

时间:2017-07-18 11:12:34

标签: android textview

我尝试创建自定义选择菜单,但它不适用于使用rom MIUI和Android 6的设备。结果是常用菜单" copy"和"选择所有"项目。在干净的Android下的其他设备和模拟器上它工作得很好。 代码

       textViewTop.setCustomSelectionActionModeCallback(new android.view.ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {

            Log.d(LOG_TAG, "onCreateActionMode");

            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            Log.d(LOG_TAG, "onPrepareActionMode");
            menu.clear();

            int quote_quick = R.drawable.ic_desktop_mac_black_24dp;
            int quote_add = R.drawable.ic_computer_black_24dp;
            int copy = R.drawable.ic_devices_other_black_24dp;

            menu.add(Menu.NONE, QUOTE_START, 3, "").setIcon(quote_quick).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
            menu.add(Menu.NONE, QUOTE_ADD, 2, "").setIcon(quote_add).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
            menu.add(Menu.NONE, CUSTOM_COPY, 1, "").setIcon(copy).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    });

4 个答案:

答案 0 :(得分:0)

只是一些想法。如果您选择菜单项onCreateOptionsMenu并将其更改,该怎么办。

赞:

public boolean onCreateOptionsMenu(final Menu menu) {
  getSupportMenuInflater().inflate(R.menu.main, menu);
  new Handler().post( -> {
      final View menuItemView = findViewById(R.id.menu_action_item);
      ...
  }
}

答案 1 :(得分:0)

所以我想出了一种解决方法,但是只有当您绝对需要它可以在MIUI设备上工作时,它才有意义。通常有点尴尬:

我注意到Wikipedia应用程序具有在小米设备上运行的自定义操作,在查看代码后,我发现当在WebView中选择文本时,它可以正常工作。 您基本上可以在您的活动

中使用WebView并覆盖onActionModeStarted

主动性:

String html = "<!DOCTYPE html>\n" +
        "<html>\n" +
        "<head>\n" +
        "</head>\n" +
        "<body>\n" +
        "\n" +
        "<h1>WebView text</h1>\n" +
        "\n" +
        "</body>\n" +
        "</html>\n";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView webView = findViewById(R.id.web_view);
    webView.setWebViewClient(new WebViewClient());
    webView.loadData(html, "text/html", "UTF-8");
}

@Override
public void onActionModeStarted(ActionMode mode) {
    super.onActionModeStarted(mode);
        Menu menu = mode.getMenu();
        menu.clear();
        mode.getMenuInflater().inflate(R.menu.menu_text_select, menu);
}

菜单:

<item android:id="@+id/id1"
      android:title="miui"
      app:showAsAction="ifRoom" />

<item android:id="@+id/id2"
      android:title="has"
      app:showAsAction="ifRoom" />

<item android:id="@+id/id3"
      android:title="bugs"
      app:showAsAction="ifRoom" />

<item android:id="@+id/id4"
    android:title="D:"
    app:showAsAction="ifRoom" />

结果: result

答案 2 :(得分:0)

根据https://developer.android.com/guide/topics/ui/menus#CAB,您需要在onCreateActionMode中创建菜单。

我做到了(在Kotlin中):

    val actionModeCallbackA = object : ActionMode.Callback {
    override fun onActionItemClicked(mode: ActionMode?, p1: MenuItem?): Boolean {
        Log.wtf("ACTION MODE", "onActionItemClicked")
        actionModeB = startActionMode(actionModeCallbackB)
        return true
    }

    override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
        Log.wtf("ACTION MODE", "onCreateActionMode")
        val inflater = mode?.getMenuInflater()
        inflater?.inflate(R.menu.context_menu, menu)
        return true
    }

    override fun onPrepareActionMode(p0: ActionMode?, p1: Menu?): Boolean {
        Log.wtf("ACTION MODE", "onPrepareActionMode")
        return false
    }

    override fun onDestroyActionMode(p0: ActionMode?) {
        Log.wtf("ACTION MODE", "onDestroyActionMode")
            actionModeA = null
    }
}

答案 3 :(得分:0)

我有类似的问题,也许我的解决方案可以帮助某人。我必须制作一个由几个水平相邻EditText组成的视图,并添加将文本粘贴到其中的功能(一个文本字母到一个editText) 我使用了ActionMode.Callback的方法,除小米设备外,它工作正常。小米设备的解决方案是在编辑文本上使用OnLongClickListener并在长按上创建PopupMenu

editText.setOnLongClickListener(v -> {
    PopupMenu menu = new PopupMenu(context,v);
    MenuInflater inflater = menu.getMenuInflater();
    inflater.inflate(R.menu.paste_menu_item, menu.getMenu());
    menu.setOnMenuItemClickListener(item -> {
       pasteText();//some custom function to handle selected action
       return false;
    });
    menu.show();
    return true;
});