Die Navigationsmodi der Aktionsleiste sind in Android L veraltet


203

Wenn ich mir den API-Diff-Bericht für die Android "L" -Vorschau anschaue, sehe ich, dass alle Methoden sich auf Navigationsmodi in der ActionBarKlasse beziehen (zsetNavigationMode() , addTab(), selectTab(), usw). sind jetzt veraltet.

Die Dokumentation erklärt:

Die Navigationsmodi der Aktionsleiste sind veraltet und werden von den Aktionsleisten der Inline-Symbolleiste nicht unterstützt. Verwenden Sie stattdessen andere gängige Navigationsmuster.

Was ist der angebliche Ersatz?

Ist "Inline-Symbolleisten-Aktionsleisten" ein neues Konzept? Ich glaube nicht, dass ich schon einmal davon gehört habe.


Wo haben Sie die Dokumente für die L-Vorschau gefunden?
Kuno

8
@KlassenK Es ist noch nicht in die Hauptdokumentation integriert, aber Sie können es von developer.android.com/preview/reference.html
matiash

Danke für den Link zu den Dokumenten!
Robert Karl

Für setNavigationList, was haben Sie verwendet
Lion789

1
@ShirishHerwade Ja, da es bei der Veröffentlichung von Android 5.0 in die Hauptdokumentation integriert wurde. In jedem Fall finden Sie den
Verfallshinweis

Antworten:


179

Die neue Android Design Support Library fügt TabLayout hinzu und bietet eine Tab-Implementierung, die den Materialdesign-Richtlinien für Tabs entspricht . Eine vollständige Anleitung zur Implementierung von Tabs ViewPagerfinden Sie in diesem Video

Jetzt veraltet: Der PagerTabStrip ist Teil der Support-Bibliothek (und das schon seit einiger Zeit) und dient als direkter Ersatz. Wenn Sie die neueren Registerkarten im Google Play-Stil bevorzugen, können Sie die PagerSlidingTabStrip-Bibliothek verwenden oder eines der von Google bereitgestellten Beispiele SlidingTabsBasic oder SlidingTabsColors ändern, wie in diesem Dev Bytes-Video erläutert .


8
Dies ist ein direkter Ersatz im Hochformat, mit dem Vorteil, dass die Verwendung eines erweiterten Headers vom Typ Material vereinfacht wird. Im Querformat werden die ActionBar-Registerkarten jedoch automatisch in die Aktionsleiste verschoben, wodurch wichtige Bildschirmbereiche frei werden. Kennt jemand einen sauberen Weg, dies mit der Support-Bibliothek zu verwalten?
Ehartwell

9
Im Entwicklerdokument wird weiterhin die Verwendung der Registerkarte "Aktionsleiste" angegeben. Simlpy noch nicht aktualisiert? developer.android.com/training/implementing-navigation/…
Romulus Urakagi Ts'ai

3
Dies ist ein Ersatz für NAVIGATION_MODE_TABS, aber nicht für NAVIGATION_MODE_LIST: /
Geob-o-matic

2
@Geobert - NAVIGATION_MODE_LISTist viel einfacher, da nur ein Spinner und einige Rückruf-Helfer hinzugefügt wurden .
Ianhanniballake

2
Wofür ist der Ersatz NAVIGATION_MODE_LIST? Meins listet es als veraltet auf ...
Sauron

20

Nachdem die Android 5.0-Dokumente verfügbar sind, haben wir die offizielle Dokumentation für das Toolbar-Widget :

Eine Standardsymbolleiste zur Verwendung in Anwendungsinhalten.

Eine Symbolleiste ist eine Verallgemeinerung von Aktionsleisten zur Verwendung in Anwendungslayouts. Während eine Aktionsleiste traditionell Teil des undurchsichtigen Fensterdekors einer Aktivität ist, das vom Framework gesteuert wird, kann eine Symbolleiste auf einer beliebigen Ebene der Verschachtelung innerhalb einer Ansichtshierarchie platziert werden .

Ein ToolbarWidget kann auch verwendet werden, um die Aktionsleiste zu ersetzen:

Eine Anwendung kann mithilfe der setActionBar()Methode eine Symbolleiste als Aktionsleiste für eine Aktivität festlegen.

Die Ablehnung von Registerkarten in der Aktionsleiste ist höchstwahrscheinlich darauf zurückzuführen, da Symbolleisten selbst keine Registerkarten enthalten können.

Es ist auch für frühere Android-Versionen über die Appcompat-Bibliothek verfügbar. Weitere Informationen finden Sie in diesem Beitrag von Chris Banes . Ein Ausschnitt:

Android 5.0 führt ein neues Toolbar-Widget ein. Dies ist eine Verallgemeinerung des ActionBar-Musters, bietet Ihnen jedoch viel mehr Kontrolle und Flexibilität bei der Verwendung. Die Symbolleiste ist eine Ansicht in Ihrer Hierarchie wie jede andere, die es einfacher macht, mit den übrigen Ansichten zu verschachteln, zu animieren und auf Bildlaufereignisse zu reagieren.


53
"viel mehr Kontrolle und Flexibilität" ist nur dann schön, wenn es vernünftige und einfach zu verwendende Standardeinstellungen gibt. Wenn etwas flexibel ist, aber Sie hier und da 20 Zeilen benötigen, damit es funktioniert, halte ich es nicht für einen Gewinn ...
TWiStErRob

1
@ TWiStErRob Ich stimme zu. Hervorhebung seiner, nicht meiner :)
matiash

6
@TWiStErRob Mir geht es genauso ... Google passt besser auf, diese Art von Aktivität erinnert mich an das alte Microsoft
Sauron

13

Es scheint, als hätten sie eine neue Klasse mit dem Namen android.widget.Toolbarerweitert ViewGroup. Auch hat sie eine neue Methode setActionBar(Toolbar)in Activity. Ich habe es noch nicht getestet, aber es sieht aus wie Sie alle Arten von wickeln können TabWidgets, Spinnersoder benutzerdefinierten Ansichten in eineToolbar und es als ActionBar verwenden.


1
Kann jemand teilen, wenn er etwas mit dem Toolbar-Widget versucht hat oder weiß, wie es funktionieren soll. Ist es auch im Kompatibilitätspaket enthalten?
Sandra


1
Vielen Dank für den Link. Wenn ich jetzt eine App entwickeln möchte, die den neuen Materialrichtlinien entspricht, sollte ich wahrscheinlich warten, bis die Symbolleiste verfügbar ist, denn wenn ich die Aktionsleiste verwende, würde ich alles verwenden das ist veraltet ..?
Sandra

1
Die ActionBar wird weiterhin ein Standard-Designmuster sein. Nur die Navigationsmodi sind veraltet (Tabs oder Spinner). Siehe developer.android.com/guide/topics/ui/actionbar.html#Tabs und developer.android.com/guide/topics/ui/actionbar.html#Dropdown
Kuno

1
Ich denke, dass es mit der Frage zusammenhängt. Die apk der neuen i / o 2014-Anwendung steht zum Download zur Verfügung. Wie Sie unter plus.google.com/+RomanNurik/posts/PD6MS3feXTT sehen können , werden zahlreiche Symbolleistenstile verwendet . Wir müssen nur auf den Quellcode warten und ihn dann erkunden :(
Sandra

4

Das neue Toolbarkann nicht zum Aufblasen mehrerer Linienobjekte verwendet werden, daher ist es unmöglich, Tabulatoren hinzuzufügen.
Wenn Sie ein Toolbarwie ein verwenden möchtenTabWidget können Sie einige Tab-Objekte einfügen, jedoch nur mit dem alten Holo-Stil.

Hier gibt es eine benutzerdefinierte Bibliothek, die v7 Toolbarwie TabWidgetbei den neuen Material Design-Animationen verwendet, jedoch dieselben Methoden wie die alten verwendet ActionBar Tabs, sodass Sie Ihre Bibliothek daran anhängen können ViewPager.


3

Für das 'Ersetzen' der veralteten ActionBar habe ich den Typ meiner Variablen vom Typ ActionBar gemäß (alter Code im Kommentar) in PagerTabStrip geändert:

// ActionBar bigActionBar;
PagerTabStrip bigActionBar;

Ein 'Ersatz' für ~ actionBars .selectTab (tabindex) war die Verwendung der .setCurrentItem (int) -Methode meines zugehörigen ViewPager wie folgt (alter Code im Kommentar):

/*
ActionBar.Tab eventTab = bigActionBar.getTabAt(2);
bigActionBar.selectTab(eventTab);
*/
mViewPager.setCurrentItem(2);

Hoffe das ist hilfreich.


1

Ich hatte das gleiche Problem und diese Lösung passte mir ganz gut:

Fügen Sie in der Layout-XML-Datei, die den Viewpager enthält, einen PagerTabStrip wie folgt hinzu:

<android.support.v4.view.PagerTabStrip
    android:id="@+id/pager_tab_strip"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:background="#996633"
    android:textColor="#CCCCCC"
    android:paddingTop="5dp"
    android:paddingBottom="5dp" />

Fügen Sie Ihrer ViewPager-Datei eine switch-Anweisung hinzu, um Seitentitel zu steuern:

@Override
public CharSequence getPageTitle(int position)
{
    switch (position)
    {
    case 0:
        return "Page 1";

    case 1:
        return "Page 2";

    case 2:
        return "Page 3";

    }

    return null;
}

0

FragmentTabHost ist ebenfalls eine Option.

Dieser Code stammt von der Android-Entwicklerseite:

/**
 * This demonstrates how you can implement switching between the tabs of a
 * TabHost through fragments, using FragmentTabHost.
 */
public class FragmentTabs extends FragmentActivity {
    private FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.fragment_tabs);
    mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

    mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
            FragmentStackSupport.CountingFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
            LoaderCursorSupport.CursorLoaderListFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
            LoaderCustomSupport.AppListFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
            LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);
    }
}

1
Hier ist ein Tutorial, das diese Antwort enthält, damit es jemandem helfen kann, skholingua.com/android-basic/user-interface/compositeitems/…
Dejan

0

Ich fand diese Tutorials hilfreich, als ich eine Aktionsleiste (jetzt die 'Symbolleiste' - argh) zusammenstellte, die Schiebelaschen mit Material Design unterstützt:

https://www.youtube.com/watch?v=Fl0xMuo10yA

http://www.exoguru.com/android/material-design/navigation/android-sliding-tabs-with-material-design.html

Sie müssen diese Ressourcen so zusammenfassen, dass sie Ihrer speziellen Situation entsprechen. Beispielsweise möchten Sie die Registerkarten möglicherweise nicht manuell im gleichen Stil wie im exoguru.com-Lernprogramm erstellen.


Der zweite Link ist tot.
Jcaruso

@jcaruso das ist nicht meine Schuld, da diese Domain abgelaufen zu sein scheint. Das Youtube-Video ist jedoch immer noch relevant
kip2

1
@ kip2 Ich stimme zu, es ist nicht deine Schuld. Ich schlage jedoch vor, wie jeder vorschlägt, aufgrund dieses Problems keine Links zu verwenden, um Antworten zu erklären.
Jcaruso

0

Gut für mich, die veraltete Navigationssymbolleiste mithilfe der Symbolleiste v7 Widget Appcompat zu handhaben.

    setSupportActionBar(toolbar);
    getSupportActionBar().setSubtitle("Feed Detail");
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //goToWhere
        }
    });

0

Ich denke, ein geeigneter Ersatz für drei bis fünf gleich wichtige Bildschirme ist die BottomNavigationActivity, mit der Fragmente gewechselt werden können.

Sie werden feststellen, dass in Android Studio ein Assistent dafür vorhanden ist. Seien Sie jedoch vorsichtig, da Android Studio dazu neigt, übermäßig komplexen Code für die Kesselplatte zu erzeugen.

Ein Tutorial finden Sie hier: https://android.jlelse.eu/ultimate-guide-to-bottom-navigation-on-android-75e4efb8105f

Ein weiteres qualitativ hochwertiges Tutorial finden Sie bei Android Hive hier: https://www.androidhive.info/2017/12/android-working-with-bottom-navigation/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.