Ich habe eine funktionierende Navigationsschublade erstellt, wie sie im Tutorial auf der Website developer.android.com gezeigt wird . Aber jetzt möchte ich eine Navigationsschublade verwenden, die ich in der NavigationDrawer.class für mehrere Aktivitäten in meiner Anwendung erstellt habe.
Meine Frage ist, ob jemand hier ein kleines Tutorial erstellen kann, in dem erklärt wird, wie eine Navigationsschublade für mehrere Aktivitäten verwendet wird.
Ich habe es zuerst in dieser Antwort Android Navigation Drawer über mehrere Aktivitäten gelesen
aber es hat bei meinem Projekt nicht funktioniert
public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.menu);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
layers));
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.drawer_list_footer, null, false);
drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
map.drawerClickEvent(pos);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
In dieser Aktivität möchte ich die Navigationsschublade haben, also erweitere ich 'NavigationDrawer' und in einigen anderen Aktivitäten möchte ich dieselbe Navigationsschublade verwenden
public class SampleActivity extends NavigationDrawer {...}
Ich weiß nicht, was ich ändern soll ...
Antworten:
Wenn Sie eine Navigationsschublade wünschen, sollten Sie Fragmente verwenden. Ich habe dieses Tutorial letzte Woche befolgt und es funktioniert großartig:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Sie können auch Beispielcode aus diesem Tutorial herunterladen, um zu sehen, wie Sie dies tun können.
Ohne Fragmente:
Dies ist Ihr BaseActivity Code:
Alle anderen Aktivitäten, für die eine Navigationsleiste erforderlich ist, sollten diese Aktivität anstelle der Aktivität selbst erweitern. Beispiel:
XML
Bearbeiten:
Ich habe selbst einige Schwierigkeiten gehabt. Hier ist eine Lösung, wenn Sie NullPointerExceptions erhalten. Ändern Sie in BaseActivity die Funktion onCreate in
protected void onCreateDrawer()
. Der Rest kann gleich bleiben. Geben Sie in den Aktivitäten, die BaseActivity erweitern, den Code in der folgenden Reihenfolge ein:Dies hat mir geholfen, mein Problem zu beheben, hoffe es hilft!
Auf diese Weise können Sie eine Navigationsleiste mit mehreren Aktivitäten erstellen, wenn Sie Fragen haben.
Bearbeiten 2:
Wie von @GregDan gesagt,
BaseActivity
können Sie dort auchsetContentView()
onCreateDrawer überschreiben und aufrufen:quelle
Ich habe die beste Implementierung gefunden. Es ist in der Google I / O 2014 App.
Sie verfolgen den gleichen Ansatz wie Kevin. Wenn Sie sich von allen nicht benötigten Dingen in der E / A-App abstrahieren können, können Sie alles extrahieren, was Sie benötigen, und Google versichert, dass das Muster der Navigationsschublade korrekt verwendet wird. Jede Aktivität hat optional ein
DrawerLayout
Hauptlayout. Der interessante Teil ist, wie die Navigation zu anderen Bildschirmen erfolgt. Es wird folgendermaßen implementiertBaseActivity
:Dies unterscheidet sich von der üblichen Methode, das aktuelle Fragment durch eine Fragmenttransaktion zu ersetzen. Der Benutzer erkennt jedoch keinen visuellen Unterschied.
quelle
overridePendingTransitions
.Diese Antwort ist also ein paar Jahre zu spät, aber jemand kann sie zu schätzen wissen. Android hat uns ein neues Widget zur Verfügung gestellt, das die Verwendung einer Navigationsleiste mit mehreren Aktivitäten erleichtert.
android.support.design.widget.NavigationView ist modular aufgebaut und verfügt über ein eigenes Layout im Menüordner. Sie verwenden es, um XML-Layouts folgendermaßen zu verpacken:
Das Stammlayout ist ein android.support.v4.widget.DrawerLayout, das zwei untergeordnete Elemente enthält: ein
<include ... />
Layout für das zu verpackende Layout (siehe 2) und ein android.support.design.widget.NavigationView.nav_header_main ist nur ein LinearLayout mit Ausrichtung = vertikal für den Header Ihres Navigationszeichens.
activity_main_drawer ist eine Menü-XML in Ihrem res / menu-Verzeichnis. Es kann Elemente und Gruppen Ihrer Wahl enthalten. Wenn Sie die AndroidStudio-Galerie verwenden, erstellt der Assistent eine grundlegende für Sie und Sie können sehen, welche Optionen Sie haben.
Das Layout der App-Leiste ist normalerweise jetzt ein android.support.design.widget.CoordinatorLayout. Dazu gehören zwei untergeordnete Elemente: ein android.support.design.widget.AppBarLayout (das eine android.support.v7.widget.Toolbar enthält) und ein
<include ... >
for Ihren tatsächlichen Inhalt (siehe 3).Das Inhaltslayout kann ein beliebiges Layout sein. Dies ist das Layout, das den Hauptinhalt der Aktivität enthält (ohne Navigationsleiste oder App-Leiste).
Das Coole an all dem ist, dass Sie jede Aktivität in diese beiden Layouts einbinden können, Ihre Navigationsansicht (siehe Schritt 1) jedoch immer auf activity_main_drawer (oder was auch immer) zeigen muss. Dies bedeutet, dass Sie für alle Aktivitäten dieselbe (*) Navigationsleiste haben.
quelle
Der einfachste Weg, eine gemeinsame Navigationsleiste in einer Gruppe von Aktivitäten wiederzuverwenden
app_base_layout.xml
AppBaseActivity.java
quelle
AppBaseActivity
und einesetContentView
Standardmethode sollten funktionieren.Für alle anderen, die das tun möchten, was das Originalplakat verlangt, sollten Sie Fragmente verwenden, wie Kevin es gesagt hat. Hier ist ein hervorragendes Tutorial dazu:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Wenn Sie stattdessen Aktivitäten anstelle von Fragmenten verwenden, tritt das Problem auf, dass die Navigationsleiste jedes Mal neu erstellt wird, wenn Sie zu einer neuen Aktivität navigieren. Dies führt jedes Mal zu einem hässlichen / langsamen Rendern der Navigationsschublade.
quelle
Mein Vorschlag lautet: Verwenden Sie überhaupt keine Aktivitäten, sondern Fragmente und ersetzen Sie sie in dem Container (z. B. lineares Layout), in dem Sie Ihr erstes Fragment anzeigen.
Der Code ist in Android Developer Tutorials verfügbar. Sie müssen ihn nur anpassen.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Es ist ratsam, dass Sie immer mehr Fragmente in Ihrer Anwendung verwenden und dass es nur vier grundlegende Aktivitäten in Ihrer Anwendung gibt, die Sie in Ihrer AndroidManifest.xml erwähnen, abgesehen von den externen (z. B. FacebookActivity):
SplashActivity: Verwendet kein Fragment und das FullScreen-Design.
LoginSignUpActivity: Benötigen Sie überhaupt keinen NavigationDrawer und auch keine Zurück-Schaltfläche. Verwenden Sie daher einfach die normale Symbolleiste. Es sind jedoch mindestens 3 oder 4 Fragmente erforderlich. Verwendet das No-Action-Bar-Thema
HomeActivity- oder DashBoard-Aktivität: Verwendet das Thema ohne Aktionsleiste. Hier benötigen Sie eine Navigationsschublade. Alle folgenden Bildschirme sind Fragmente oder verschachtelte Fragmente bis zur Blattansicht mit der gemeinsam genutzten Schublade. Alle Einstellungen, Benutzerprofile usw. werden in dieser Aktivität als Fragmente angezeigt. Die Fragmente hier werden nicht zum hinteren Stapel hinzugefügt und über die Menüpunkte der Schublade geöffnet. Bei Fragmenten, für die anstelle der Schublade ein Zurück-Button erforderlich ist, gibt es unten eine vierte Art von Aktivität.
Aktivität ohne Schublade. Diese Aktivität hat oben einen Zurück-Button und die darin enthaltenen Fragmente teilen sich dieselbe Aktionsleiste. Diese Fragmente werden dem Backstack hinzugefügt, da es einen Navigationsverlauf gibt.
[Weitere Hinweise finden Sie unter: https://stackoverflow.com/a/51100507/787399 ]
Viel Spaß beim Codieren !!
quelle
Aktualisieren Sie diesen Code in Basisaktivität. und vergessen Sie nicht, drawer_list_header in Ihre Aktivitäts-XML aufzunehmen.
und verwenden Sie request () nicht in Ihrer Aktivität. Trotzdem ist die Schublade beim Klicken auf das Bild nicht sichtbar. Durch Ziehen wird sie ohne Listenelemente angezeigt. Ich habe viel versucht, aber keinen Erfolg. brauche ein paar Workouts dafür ...
quelle
Mit der Antwort von @Kevin van Mierlo können Sie auch mehrere Schubladen implementieren. Zum Beispiel das Standardmenü auf der linken Seite (Start) und ein weiteres optionales Menü auf der rechten Seite, das nur angezeigt wird, wenn bestimmte Fragmente geladen werden.
Das habe ich geschafft.
quelle
Verwenden Sie dies für Ihre toolbar.xml
Verwenden Sie diese Option für den Navigationsheader, wenn Sie sie verwenden möchten
quelle
Ich mache es in Kotlin so:
Aktivitäten für die Schublade müssen dies erben
BaseAppCompatActivity
,super.onCreate
nach dem Festlegen des Inhalts aufrufen (kann tatsächlich auf eine Init-Methode verschoben werden) und entsprechende Elemente für IDs in ihrem Layout habenquelle
Meine Antwort ist nur eine konzeptionelle ohne Quellcode. Es könnte für einige Leser wie mich nützlich sein, dies zu verstehen.
Dies hängt von Ihrer anfänglichen Herangehensweise an die Architektur Ihrer App ab. Grundsätzlich gibt es zwei Ansätze.
Sie erstellen eine Aktivität (Basisaktivität) und alle anderen Ansichten und Bildschirme sind Fragmente. Diese Basisaktivität enthält die Implementierung für Schubladen- und Koordinatorlayouts. Dies ist eigentlich meine bevorzugte Methode, da kleine, in sich geschlossene Fragmente die App-Entwicklung einfacher und reibungsloser machen.
Wenn Sie Ihre App-Entwicklung mit Aktivitäten gestartet haben, eine für jeden Bildschirm, erstellen Sie wahrscheinlich eine Basisaktivität, und alle anderen Aktivitäten erstrecken sich davon. Die Basisaktivität enthält den Code für die Implementierung von Schubladen und Koordinatoren. Jede Aktivität, die eine Schubladenimplementierung erfordert, kann sich von der Basisaktivität erstrecken.
Ich persönlich würde es vorziehen, Fragmente und Aktivitäten zu vermeiden, die ohne Organisation gemischt werden. Das macht die Entwicklung schwieriger und bringt Sie irgendwann zum Stillstand. Wenn Sie dies getan haben, überarbeiten Sie Ihren Code.
quelle
Erstellen Sie eine Navigationsleiste in Ihrer MainActivity mithilfe eines Fragments.
Initialisieren Sie die Navigationsschublade in MainActivity
jetzt in allen anderen Aktivitäten, die Sie für dieselbe Navigationsschublade verwenden möchten. Setzen Sie DrawerLayout als Basis und Fragment als Navigationsschublade. Setzen Sie einfach android: name in Ihrem Fragment, der auf Ihre Fragment-Java-Datei verweist. Sie müssen das Fragment in anderen Aktivitäten nicht initialisieren.
Sie können auf Nav Drawer zugreifen, indem Sie in anderen Aktivitäten wie in der Google Play Store-App wischen
quelle