Apparaten met Android + MIUI en setCustomSelectionActionModeCallback

Ik probeer een aangepast selectiemenu te maken, maar het werkt niet op een apparaat met ROM MIUI en Android 6. Het resultaat is een algemeen menu met copyen select allartikelen. Op andere apparaten en simulators onder schone Android werkt het prima.

De code:

       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) {
        }
    });

Antwoord 1, autoriteit 100%

Dus ik heb een tijdelijke oplossing bedacht, maar het heeft alleen zin als je het absoluut nodig hebt om op MIUI-apparaten te werken. Het is over het algemeen een beetje onhandig:

Ik heb gemerkt dat de Wikipedia-app aangepaste acties heeft die werken op een Xiaomi-apparaat, en nadat ik de code had bekeken, ontdekte ik dat het prima werkt als de teksten zijn geselecteerd in een WebView.
U kunt in principe een WebViewgebruiken en onActionModeStartedoverschrijven in uw Activiteit

Activiteit:

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);
}

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" />

Resultaat:
resultaat


Antwoord 2

Gewoon wat gedachten. Wat als u menu-item onCreateOptionsMenuneemt en het wijzigt.

Zoals dit:

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

Antwoord 3

Volgens https://developer.android.com/guide/topics /ui/menus#CABje moet een menu maken in onCreateActionMode.

Ik heb het zo gemaakt (in 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
    }
}

Antwoord 4

Ik had een soortgelijk probleem, misschien kan mijn oplossing iemand helpen. Ik moest een weergave maken bestaande uit verschillende horizontale aangrenzende EditText‘s, en de mogelijkheid toevoegen om er tekst in te plakken (één letter tekst in één editText)
Ik gebruikte de aanpak van ActionMode.Callbacken het werkte prima, behalve Xiaomi-apparaten. De oplossing voor Xiaomi-apparaten was het gebruik van OnLongClickListenerbij het bewerken van teksten en het maken van PopupMenubij een lange klik:

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;
});

Other episodes