24

Mam aktywność z paskiem aplikacji i szufladą nawigacji. Pasek aplikacji został zaimplementowany przy użyciu nowej klasy paska narzędzi Toolbar z biblioteki appcompat-v7 w wersji 21. +, a przed nią wyświetlona jest szuflada nawigacji.Jak sprawić, aby kontekstowy pasek trybu działania nakładał się na pasek narzędzi appcompat-v7, ale nie na szufladę nawigacji?

Aktywność zawiera widok listy z elementami, które można wybrać, dlatego pokazuję pasek działań kontekstowych (CAB). Jest uruchamiany przez wywołanie:

ActionBarActivity.startSupportActionMode(android.support.v7.view.ActionMode.Callback callback) 

Domyślnie CAB jest wstawiany powyżej Toolbar zamiast nakładania go; wygląda na to, że CAB będzie domyślnie nakładał tylko prawdziwy ActionBar. Jak przedstawienie w this answer, CAB prawidłowo nakłada się pasek Gdy ta właściwość jest ustawiona motyw:

<item name="windowActionModeOverlay">true</item> 

Ale to także sprawia nakładkę CAB szufladę nawigacji, który jest nieprawidłowy według the Material design specs. Główny dokument projektowy systemu Android ukrywa CAB, gdy szuflada nawigacji jest otwarta i wyświetla ją ponownie, gdy jest zamknięta, i this could be done, aby "naprawić" problem, ale nie powinno to być konieczne. Odtworzone specyfikacje projektowe materiałów nie określają, że CAB powinny być ukryte, gdy szuflada nav otwiera się, a ponieważ szuflada nav powinna otwierać się nad CAB, ukrycie CAB byłoby w rzeczywistości wizualnym rozproszeniem.

Czy istnieje sposób na wyświetlenie szuflady nawigacyjnej przed jednostką CAB, która wciąż ma nałożony pasek narzędzi?

Odpowiedz

1

Być może znalazłem rozwiązanie - a może proste rozwiązanie.
Miałem ten sam problem nawet z ListFragment, gdy użyto startActionMode() zamiast wbudowanego setChoiceMode(). Więc zajrzałem do kodu ListFragment i znalazłem, że startActionMode() nie jest wywoływany w działaniu, ale raczej na jego ListView, więc próbowałem używać widoku. W moim kodu teraz to najwyraźniej działa zgodnie z oczekiwaniami, stosując albo ListView fragment:

ActionMode mActionMode = getListView().startActionMode(this); 

lub przy użyciu pojemnika aktywny, który zawiera moje fragment:

View aView = getActivity().findViewById(R.id.container); 
ActionMode mActionMode = aView.startActionMode(this); 

także:

  • teraz przycisk Wstecz niszczy tryb działania, zanim jeszcze nie zadziałał
  • CAB teraz poprawnie zakrywa Pasek Działania, podczas gdy g windowActionModeOverlay w moim stylu został obejmujące tylko część to - przynajmniej w moim przypadku
  • ikona CAB to strzałki wstecz zamiast kleszcza - nie wiem, co to znaczy, choć

Szczerze mówiąc jestem nie jestem pewien co do tego przyczyny, więc nie jestem pewny, jak bezpieczne są te rozwiązania, ale na razie wydaje się, że działają dobrze.
Jeśli ktokolwiek ma lepsze zrozumienie, prosimy o komentarz lub edycję.

+3

Używam RecyclerView zamiast ListView. Przynajmniej w tym przypadku to nie zadziałało. CAB jest nadal w mojej szufladzie. –