Ich habe eine funktionierende Navigationsleiste erstellt, wie sie im Tutorial auf der developer.Android.com Website gezeigt wird. Nun möchte ich jedoch einen Navigations-Drawer verwenden, den ich in der NavigationDrawer.class für mehrere Aktivitäten in meiner Anwendung erstellt habe.
Meine Frage ist, ob jemand hier ein kleines Tutorial machen kann, in dem erklärt wird, wie ein Navigationsfach für mehrere Aktivitäten verwendet wird.
Ich habe es zuerst in dieser Antwort gelesen Android Navigation Drawer über mehrere Aktivitäten
aber bei meinem Projekt hat es 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 Navigationsleiste haben, sodass ich 'NavigationDrawer' erweitern kann, und in einigen anderen Aktivitäten möchte ich dieselbe Navigationsleiste verwenden
public class SampleActivity extends NavigationDrawer {...}
Ich weiß nicht was ich ändern soll ...
Wenn Sie eine Navigationsleiste wünschen, sollten Sie Fragmente verwenden. Ich habe dieses Tutorial letzte Woche verfolgt und es funktioniert hervorragend:
http://developer.Android.com/training/implementing-navigation/nav-drawer.html
Sie können auch Beispielcode aus diesem Tutorial herunterladen, um zu erfahren, wie Sie dies tun können.
Ohne Fragmente:
Dies ist Ihr BaseActivity Code:
public class BaseActivity extends Activity
{
public DrawerLayout drawerLayout;
public ListView drawerList;
public String[] layers;
private ActionBarDrawerToggle drawerToggle;
private Map map;
protected void onCreate(Bundle savedInstanceState)
{
// R.id.drawer_layout should be in every activity with exactly the same id.
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);
}
}
Alle anderen Aktivitäten, für die eine Navigationsleiste erforderlich ist, sollten diese Aktivität erweitern, anstatt Aktivität selbst. Beispiel:
public class AnyActivity extends BaseActivity
{
//Because this activity extends BaseActivity it automatically has the navigation drawer
//You can just write your normal Activity code and you don't need to add anything for the navigation drawer
}
XML
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
Android:id="@+id/content_frame"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer -->
</FrameLayout>
<!-- The navigation drawer -->
<ListView Android:id="@+id/left_drawer"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:choiceMode="singleChoice"
Android:divider="@Android:color/transparent"
Android:dividerHeight="0dp"
Android:background="#111"/>
</Android.support.v4.widget.DrawerLayout>
Bearbeiten:
Ich habe selbst einige Schwierigkeiten erlebt, daher hier eine Lösung, wenn Sie NullPointerExceptions erhalten. Ändern Sie in BaseActivity die Funktion onCreate in protected void onCreateDrawer()
. Der Rest kann gleich bleiben. In den Aktivitäten, die BaseActivity erweitern, geben Sie den Code in dieser Reihenfolge ein:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
super.onCreateDrawer();
Das hat mir geholfen, mein Problem zu lösen, hoffe es hilft!
So können Sie eine Navigationsleiste mit mehreren Aktivitäten erstellen, wenn Sie Fragen haben, zögern Sie nicht.
Edit 2:
Wie von @GregDan gesagt, kann Ihre BaseActivity
auch setContentView()
überschreiben und dort onCreateDrawer aufrufen:
@Override
public void setContentView(@LayoutRes int layoutResID)
{
super.setContentView(layoutResID);
onCreateDrawer() ;
}
Ich habe die beste Implementierung gefunden. Es ist in der Google I/O 2014 App.
Sie verwenden den gleichen Ansatz wie Kevins. Wenn Sie sich in der E/A-App von allem nicht benötigten Material abgrenzen können, können Sie alles extrahieren, was Sie benötigen, und es wird von Google sichergestellt, dass dies die korrekte Verwendung des Navigations-Schubladenmusters ist. .__ Jede Aktivität hat optional eine DrawerLayout
als Hauptlayout. Der interessante Teil ist, wie die Navigation zu anderen Bildschirmen erfolgt. Es ist in BaseActivity
wie folgt implementiert:
private void goToNavDrawerItem(int item) {
Intent intent;
switch (item) {
case NAVDRAWER_ITEM_MY_SCHEDULE:
intent = new Intent(this, MyScheduleActivity.class);
startActivity(intent);
finish();
break;
Dies unterscheidet sich von der üblichen Art und Weise, das aktuelle Fragment durch eine Fragmenttransaktion zu ersetzen. Der Benutzer erkennt jedoch keinen visuellen Unterschied.
Diese Antwort ist also einige Jahre zu spät, aber jemand mag es zu schätzen wissen. Android hat uns ein neues Widget gegeben, das die Verwendung einer Navigationsleiste mit verschiedenen Aktivitäten vereinfacht.
Android.support.design.widget.NavigationView ist modular und hat ein eigenes Layout im Menüordner. Sie verwenden XML-Layouts folgendermaßen:
Root Layout ist ein Android.support.v4.widget.DrawerLayout, das zwei untergeordnete Elemente enthält: einen <include ... />
für das Layout, das verpackt wird (siehe 2), und ein Android.support.design.widget.NavigationView.
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
nav_header_main ist nur ein LinearLayout mit der Ausrichtung = vertikal für die Kopfzeile Ihres Navigationszeichens.
activity_main_drawer ist eine Menü-XML in Ihrem Verzeichnis res/menu. Es kann Elemente und Gruppen Ihrer Wahl enthalten. Wenn Sie die AndroidStudio-Galerie verwenden, erstellt der Assistent eine grundlegende Option 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, und das wird zwei Kinder enthalten: ein Android.support.design.widget.AppBarLayout (das eine Android.support.v7.widget.Toolbar enthält) und einen <include ... >
für Ihren tatsächlichen Inhalt (siehe 3).
<Android.support.design.widget.CoordinatorLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="yourpackage.MainActivity">
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</Android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
Das Inhaltslayout kann beliebig sein. Dies ist das Layout, das den Hauptinhalt der Aktivität enthält (nicht die Navigationsleiste oder die App-Leiste).
Das Tolle an all dem ist nun, dass Sie jede Aktivität in diesen beiden Layouts einbetten können, aber Ihre Navigationsansicht (siehe Schritt 1) immer auf activity_main_drawer (oder was auch immer) verweist. Dies bedeutet, dass Sie für alle Aktivitäten die gleiche (*) Navigationsleiste verwenden.
Für alle anderen, die das tun möchten, was das Originalposter verlangt, sollten Sie Fragmente verwenden, wie es von Kevin gesagt wurde. Hier ist ein hervorragendes Tutorial, wie das geht:
https://github.com/codepath/Android_guides/wiki/Fragment-Navigation-Drawer
Wenn Sie stattdessen Aktivitäten anstelle von Fragmenten verwenden, stoßen Sie bei jedem Navigieren zu einer neuen Aktivität auf das Problem, dass die Nav-Schublade neu erstellt wird. Dies führt jedes Mal zu einer unschönen/langsamen Wiedergabe der Nav-Schublade.
Mein Vorschlag ist: Verwenden Sie 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, die Sie nur anpassen müssen.
http://developer.Android.com/training/implementing-navigation/nav-drawer.html
Es ist ratsam, dass Sie immer mehr Fragmente in Ihrer Anwendung verwenden, und es sollten nur vier grundlegende Aktivitäten für Ihre Anwendung vorhanden sein, die Sie in Ihrer AndroidManifest.xml neben den externen Aktionen (beispielsweise FacebookActivity) angeben:
SplashActivity: verwendet kein Fragment und verwendet das FullScreen-Design.
LoginSignUpActivity: Sie benötigen keinerlei NavigationDrawer und auch keine Zurück-Schaltfläche. Verwenden Sie einfach die normale Symbolleiste. Es werden jedoch mindestens 3 oder 4 Fragmente benötigt. Verwendet kein Aktionsleisten-Thema
HomeActivity- oder DashBoard-Aktivität: Verwendet kein Aktionsleisten-Thema. Hier benötigen Sie eine Navigations-Schublade. Alle folgenden Bildschirme sind Fragmente oder verschachtelte Fragmente bis zur Blattansicht mit der gemeinsamen Schublade. Alle Einstellungen, Benutzerprofil usw. werden hier als Fragmente in dieser Aktivität angezeigt. Die Fragmente werden nicht zum hinteren Stapel hinzugefügt und werden über die Menüelemente der Schublade geöffnet. Bei Fragmenten, für die anstelle der Schublade ein Zurück-Button erforderlich ist, wird nachstehend eine vierte Aktivität aufgeführt.
Tätigkeit ohne Schublade. Diese Aktivität hat oben eine Schaltfläche "Zurück", und die Fragmente im Inneren teilen 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 !!
Einfachste Möglichkeit, eine gemeinsame Navigationsleiste in einer Gruppe von Aktivitäten wiederzuverwenden.
app_base_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<FrameLayout
Android:id="@+id/view_stub"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:menu="@menu/menu_test"
/>
</Android.support.v4.widget.DrawerLayout>
AppBaseActivity.Java
/*
* This is a simple and easy approach to reuse the same
* navigation drawer on your other activities. Just create
* a base layout that conains a DrawerLayout, the
* navigation drawer and a FrameLayout to hold your
* content view. All you have to do is to extend your
* activities from this class to set that navigation
* drawer. Happy hacking :)
* P.S: You don't need to declare this Activity in the
* AndroidManifest.xml. This is just a base class.
*/
import Android.content.Intent;
import Android.content.res.Configuration;
import Android.os.Bundle;
import Android.support.design.widget.NavigationView;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.support.v7.app.AppCompatActivity;
import Android.view.LayoutInflater;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.FrameLayout;
public abstract class AppBaseActivity extends AppCompatActivity implements MenuItem.OnMenuItemClickListener {
private FrameLayout view_stub; //This is the framelayout to keep your content view
private NavigationView navigation_view; // The new navigation view from Android Design Library. Can inflate menu resources. Easy
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private Menu drawerMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.app_base_layout);// The base layout that contains your navigation drawer.
view_stub = (FrameLayout) findViewById(R.id.view_stub);
navigation_view = (NavigationView) findViewById(R.id.navigation_view);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawerMenu = navigation_view.getMenu();
for(int i = 0; i < drawerMenu.size(); i++) {
drawerMenu.getItem(i).setOnMenuItemClickListener(this);
}
// and so on...
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
/* Override all setContentView methods to put the content view to the FrameLayout view_stub
* so that, we can make other activity implementations looks like normal activity subclasses.
*/
@Override
public void setContentView(int layoutResID) {
if (view_stub != null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
View stubView = inflater.inflate(layoutResID, view_stub, false);
view_stub.addView(stubView, lp);
}
}
@Override
public void setContentView(View view) {
if (view_stub != null) {
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
view_stub.addView(view, lp);
}
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (view_stub != null) {
view_stub.addView(view, params);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:
// handle it
break;
case R.id.item2:
// do whatever
break;
// and so on...
}
return false;
}
}
package xxxxxx;
import Android.app.SearchManager;
import Android.content.Context;
import Android.content.Intent;
import Android.widget.SearchView;
import Android.support.design.widget.NavigationView;
import Android.support.v4.widget.DrawerLayout;
import Android.support.v7.app.ActionBarDrawerToggle;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.support.v7.widget.Toolbar;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.Toast;
public class loginhome extends AppCompatActivity {
private Toolbar toolbar;
private NavigationView navigationView;
private DrawerLayout drawerLayout;
// Make sure to be using Android.support.v7.app.ActionBarDrawerToggle version.
// The Android.support.v4.app.ActionBarDrawerToggle has been deprecated.
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loginhome);
// Initializing Toolbar and setting it as the actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Initializing NavigationView
navigationView = (NavigationView) findViewById(R.id.nav_view);
//Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger on item Click of navigation menu
public boolean onNavigationItemSelected(MenuItem menuItem) {
//Checking if the item is in checked state or not, if not make it in checked state
if(menuItem.isChecked()) menuItem.setChecked(false);
else menuItem.setChecked(true);
//Closing drawer on item click
drawerLayout.closeDrawers();
//Check to see which item was being clicked and perform appropriate action
switch (menuItem.getItemId()){
//Replacing the main content with ContentFragment Which is our Inbox View;
case R.id.nav_first_fragment:
Toast.makeText(getApplicationContext(),"First fragment",Toast.LENGTH_SHORT).show();
FirstFragment fragment = new FirstFragment();
Android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame,fragment);
fragmentTransaction.commit();
return true;
// For rest of the options we just show a toast on click
case R.id.nav_second_fragment:
Toast.makeText(getApplicationContext(),"Second fragment",Toast.LENGTH_SHORT).show();
SecondFragment fragment2 = new SecondFragment();
Android.support.v4.app.FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
fragmentTransaction2.replace(R.id.frame,fragment2);
fragmentTransaction2.commit();
return true;
default:
Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
return true;
}
}
});
// Initializing Drawer Layout and ActionBarToggle
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){
@Override
public void onDrawerClosed(View drawerView) {
// Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
super.onDrawerClosed(drawerView);
}
@Override
public void onDrawerOpened(View drawerView) {
// Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank
super.onDrawerOpened(drawerView);
}
};
//Setting the actionbarToggle to drawer layout
drawerLayout.setDrawerListener(actionBarDrawerToggle);
//calling sync state is necessay or else your hamburger icon wont show up
actionBarDrawerToggle.syncState();
}
verwenden Sie dies für Ihre toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/colorPrimary"
Android:elevation="4dp"
Android:id="@+id/toolbar"
Android:theme="@style/ThemeOverlay.AppCompat.Dark"
>
</Android.support.v7.widget.Toolbar>
verwenden Sie dies für den Navigationsheader, wenn Sie verwenden möchten
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="192dp"
Android:background="?attr/colorPrimaryDark"
Android:padding="16dp"
Android:theme="@style/ThemeOverlay.AppCompat.Dark"
Android:orientation="vertical"
Android:gravity="bottom">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="56dp"
Android:id="@+id/navhead"
Android:orientation="vertical"
Android:layout_alignParentBottom="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentStart="true">
<TextView
Android:id="@+id/name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginLeft="16dp"
Android:textColor="#ffffff"
Android:text="tanya"
Android:textSize="14sp"
Android:textStyle="bold"
/>
<TextView
Android:id="@+id/email"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#ffffff"
Android:layout_marginLeft="16dp"
Android:layout_marginTop="5dp"
Android:text="tanya.com"
Android:textSize="14sp"
Android:textStyle="normal"
/>
</LinearLayout>
<de.hdodenhof.circleimageview.CircleImageView
Android:layout_width="70dp"
Android:layout_height="70dp"
Android:layout_below="@+id/imageView"
Android:layout_marginTop="15dp"
Android:src="@drawable/face"
Android:id="@+id/circleView"
/>
</RelativeLayout>
aktualisieren Sie diesen Code in Baseaktivität. und vergessen Sie nicht, drawer_list_header in Ihre Aktivitäts-XML einzuschließen.
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);
und verwenden Sie nicht request () in Ihrer Aktivität. Die Schublade ist jedoch beim Klicken auf das Bild nicht sichtbar ... und durch Ziehen wird sie ohne Listenelemente angezeigt. Ich habe viel versucht, aber keinen Erfolg. brauche ein paar Workouts dafür ...
Ich mache es in Kotlin so:
open class BaseAppCompatActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
protected lateinit var drawerLayout: DrawerLayout
protected lateinit var navigationView: NavigationView
@Inject
lateinit var loginService: LoginService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("BaseAppCompatActivity", "onCreate()")
App.getComponent().inject(this)
drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout
val toolbar = findViewById(R.id.toolbar) as Toolbar
setSupportActionBar(toolbar)
navigationView = findViewById(R.id.nav_view) as NavigationView
navigationView.setNavigationItemSelectedListener(this)
val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawerLayout.addDrawerListener(toggle)
toggle.syncState()
toggle.isDrawerIndicatorEnabled = true
val navigationViewHeaderView = navigationView.getHeaderView(0)
navigationViewHeaderView.login_txt.text = SharedKey.username
}
private inline fun <reified T: Activity> launch():Boolean{
if(this is T) return closeDrawer()
val intent = Intent(applicationContext, T::class.Java)
startActivity(intent)
finish()
return true
}
private fun closeDrawer(): Boolean {
drawerLayout.closeDrawer(GravityCompat.START)
return true
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val id = item.itemId
when (id) {
R.id.action_tasks -> {
return launch<TasksActivity>()
}
R.id.action_contacts -> {
return launch<ContactActivity>()
}
R.id.action_logout -> {
createExitDialog(loginService, this)
}
}
return false
}
}
Aktivitäten für die Schublade müssen diese BaseAppCompatActivity
erben, super.onCreate
aufrufen, nachdem der Inhalt festgelegt wurde (kann tatsächlich in eine init-Methode verschoben werden) und entsprechende Elemente für ids in ihrem Layout enthalten
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.
Ich habe das geschafft.
Meine Antwort ist nur eine konzeptionelle Antwort ohne Quellcode. Für manche Leser mag es hilfreich sein zu verstehen.
Es hängt von Ihrem ursprünglichen Ansatz ab, wie Sie Ihre App gestalten. 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 Drawer- und Coordinator-Layouts. Dies ist eigentlich meine bevorzugte Vorgehensweise, da kleine, in sich geschlossene Fragmente die App-Entwicklung einfacher und flüssiger 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 darauf. Die Basisaktivität enthält den Code für die Implementierung von Zeichnern und Koordinatoren. Jede Aktivität, für die eine Schubladenimplementierung erforderlich ist, kann von der Basisaktivität ausgehen.
Ich persönlich würde es lieber vermeiden, Fragmente und Aktivitäten ohne Organisation zu verwenden. Das erschwert die Entwicklung und bringt Sie irgendwann zum Stehen. Wenn Sie es getan haben, überarbeiten Sie Ihren Code.