it-swarm.com.de

Gleiche Navigationsleiste in verschiedenen Aktivitäten

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 ...

187
MEX

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() ;
}
169

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.

34
WindRider

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:

  1. 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.

  1. 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" />
    

  2. 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.

  • Sie sind nicht die gleiche Instanz von NavigationView, aber um ehrlich zu sein, war dies selbst mit der oben beschriebenen BaseActivity-Lösung nicht möglich.
7
jwehrle

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. 

7
Micro

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:

  1. SplashActivity: verwendet kein Fragment und verwendet das FullScreen-Design.

  2. 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

  3. 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.

  4. 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 !!

5
Abhinav Saxena

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;
    }
}
3
Levon Petrosyan
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>
1
Volverine

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 ...

1
M S Gadag

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

1
Pavlus

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.

1
russellhoff

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. 

  1. 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.

  2. 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.

0