web-dev-qa-db-de.com

Aktionsleisten-Navigationsmodi sind in Android L veraltet

Wenn ich mir den API-Diff-Bericht für die Android-Vorschau "L" ansehe, sehe ich, dass alle Methoden, die sich auf die Navigationsmodi der Klasse ActionBar beziehen (z. B. setNavigationMode(), addTab(), selectTab(), & c). sind jetzt veraltet.

Die Dokumentation erklärt:

Aktionsleisten-Navigationsmodi werden nicht mehr unterstützt und von Inline .__ nicht unterstützt. Symbolleisten-Aktionsleisten. Erwägen Sie die Verwendung anderer gängiger Navigationsmuster stattdessen.

Was ist der angebliche Ersatz?

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

200
matiash

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

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

177
ianhanniballake

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

Eine Standard-Symbolleiste zur Verwendung in Anwendungsinhalten.

Eine Symbolleiste ist eine Verallgemeinerung von Aktionsleisten für die Verwendung in Anwendungslayouts. Während eine Aktionsleiste traditionell Teil eines .__ ist. Das undurchsichtige Fensterdekor der Aktivität, das vom Framework gesteuert wird, eine Symbolleiste kann auf einer beliebigen Ebene der Verschachtelung innerhalb einer Ansicht platziert werden Hierarchie.

Ein Toolbar-Widget kann auch verwendet werden, um die Aktionsleiste zu ersetzen:

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

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

Es ist auch für frühere Android-Versionen über die appcompat-Bibliothek verfügbar. Siehe dieser Beitrag von Chris Banes für weitere Informationen. Ein Ausschnitt:

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

20
matiash

Es scheint, als hätten sie eine neue Klasse namens Android.widget.Toolbar hinzugefügt, die ViewGroup erweitert. Außerdem wurde eine neue Methode setActionBar(Toolbar) in Activity hinzugefügt. Ich habe es noch nicht getestet, aber es sieht so aus, als könnten Sie alle Arten von TabWidgets, Spinners oder benutzerdefinierten Ansichten in eine Toolbar einbinden und als Aktionsleiste verwenden.

13
Kuno

Die neue Variable Toolbar kann nicht zum Aufblasen mehrerer Linienobjekte verwendet werden. Daher können keine Tabs hinzugefügt werden.
Wenn Sie eine Toolbar wie eine TabWidget verwenden möchten, können Sie einige Tab-Objekte einfügen, jedoch nur mit dem alten Holo-Stil.

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

4
NeoKree

Um die veraltete ActionBar zu ersetzen, habe ich den Typ meiner ActionBar-Variablen in PagerTabStrip geändert (gemäß altem Code im Kommentar):

// ActionBar bigActionBar;
PagerTabStrip bigActionBar;

Als 'Ersatz' für ~ actionBar .selectTab (tabindex) wurde die .setCurrentItem (int) -Methode meines verbundenen ViewPagers verwendet, wie folgt (alter Code in Kommentar):

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

Hoffe das ist hilfreich.

2
applesauced

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

Fügen Sie in der Layout-XML-Datei, die den Viewpager enthält, einen PagerTabStrip wie gezeigt 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;
}
1
AR Ross

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

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

Ein Tutorial kann hier gefunden werden: https://Android.jlelse.eu/ultimate-guide-to-bottom-navigation-on-Android-75e4efb8105f

Ein weiteres Qualitäts-Tutorial finden Sie unter Android Hive hier: https://www.androidhive.info/2017/12/Android-working-with-bottom-navigation/

0
Andrew S

FragmentTabHost ist auch 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);
    }
}
0
Anuj

Ich fand diese Tutorials hilfreich beim Zusammenstellen einer Aktionsleiste (jetzt die "Werkzeugleiste" - argh), die Schieberegler 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 zusammenstellen, dass sie zu Ihrer speziellen Situation passen. Möglicherweise möchten Sie die Registerkarten nicht manuell in demselben Stil wie im Tutorial von exoguru.com erstellen. 

0
kip2

Nun, ich verstehe die veraltete Navigationssymbolleiste mithilfe von Toolbar v7 widget appcompat.

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