Ta sama Szuflada nawigacyjna w różnych działaniach

Zrobiłem działającą szufladę nawigacyjną, jak pokazano w tutorialu na developer.android.com strona internetowa. Ale teraz chcę skorzystać z jednej szuflady nawigacyjnej, którą stworzyłem w NavigationDrawer.zajęcia dla wielu zajęć w mojej aplikacji.

Moje pytanie brzmi, czy ktoś tutaj może zrobić mały samouczek, który wyjaśnia, jak korzystać z jednej szuflady nawigacyjnej dla wielu działań.

Przeczytałem pierwszy przy tej odpowiedzi Szuflada do nawigacji Android na wielu Działania

Ale to nie działa na moim projekcie

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

W tym ćwiczeniu chcę mieć szufladę nawigacyjną, więc rozszerzam "NavigationDrawer", a w niektórych innych ćwiczeniach chcę korzystać z tej samej szuflady nawigacyjnej

  public class SampleActivity extends NavigationDrawer {...}
Nie wiem, co zmienić...
Author: Community, 2013-10-18

11 answers

Jeśli chcesz mieć szufladę nawigacyjną, powinieneś użyć fragmentów. Po tym tutorialu w zeszłym tygodniu i działa świetnie:

Http://developer.android.com/training/implementing-navigation/nav-drawer.html

Możesz również pobrać przykładowy kod z tego samouczka, aby zobaczyć, jak możesz to zrobić.


Bez fragmentów:

To jest Twój kod bazowy:

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

Wszystkie inne czynności, które muszą mieć szufladę nawigacyjną, powinny rozszerzyć to Aktywność zamiast samej aktywności, przykład:

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>

Edit:

Sam doświadczyłem pewnych trudności, więc oto rozwiązanie, jeśli otrzymasz NullPointerExceptions. W BaseActivity Zmień funkcję onCreate na protected void onCreateDrawer(). Reszta może pozostać taka sama. W działaniach rozszerzających BaseActivity umieść kod w tej kolejności:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    super.onCreateDrawer();

To pomogło mi rozwiązać mój problem, mam nadzieję, że pomoże!

Tak można stworzyć szuflada nawigacyjna z wieloma aktywnościami, jeśli masz jakiekolwiek pytania, nie krępuj się pytać.


Edytuj 2:

Jak powiedział @ GregDan Twój BaseActivity może również zastąpić setContentView() i wywołać tam onCreateDrawer:

@Override 
public void setContentView(@LayoutRes int layoutResID) 
{ 
    super.setContentView(layoutResID); 
    onCreateDrawer() ;
}
 161
Author: Kevin van Mierlo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-30 19:24:26

Znalazłem najlepszą realizację. Jest w aplikacji Google I / O 2014 .

Używają tego samego podejścia, jak Kevin ' s. Jeśli można wyodrębnić się z wszystkich niepotrzebnych rzeczy w aplikacji I / O,można wyodrębnić wszystko, czego potrzebujesz i to jest zapewnione przez Google, że jest to prawidłowe wykorzystanie wzorca szuflady nawigacji. Każda aktywność opcjonalnie ma DrawerLayout jako główny układ. Ciekawą częścią jest to, jak odbywa się nawigacja do innych ekranów. Jest zaimplementowany w BaseActivity Jak to:

private void goToNavDrawerItem(int item) {
        Intent intent;
        switch (item) {
            case NAVDRAWER_ITEM_MY_SCHEDULE:
                intent = new Intent(this, MyScheduleActivity.class);
                startActivity(intent);
                finish();
                break;

Różni się to od popularnego sposobu zastępowania bieżącego fragmentu transakcją fragmentaryczną. Ale użytkownik nie dostrzega wizualnej różnicy.

 32
Author: WindRider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-23 11:17:51

Dla wszystkich, którzy chcą zrobić to, o co prosi oryginalny plakat, proszę rozważyć użycie fragmentów zamiast sposobu, W Jaki powiedział Kevin. Oto doskonały samouczek, Jak to zrobić:

Https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer

Jeśli zdecydujesz się na użycie działań zamiast fragmentów, napotkasz problem ponownego tworzenia szuflady nawigacyjnej za każdym razem, gdy przejdziesz do nowej aktywności. Skutkuje to brzydkim / powolnym renderowanie szuflady nav za każdym razem.

 6
Author: Micro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 08:28:17

Więc ta odpowiedź jest kilka lat spóźniona, ale ktoś może ją docenić. Android dał nam nowy widget, który sprawia, że korzystanie z jednej szuflady nawigacji z kilku działań łatwiejsze.

Android.wsparcie.design.widget.NavigationView jest modułowy i ma własny układ w folderze menu. Sposób, w jaki go używasz, polega na zawijaniu układów xml w następujący sposób:
  1. Root Layout to android.wsparcie.v4.widget.DrawerLayout, który zawiera dwoje dzieci: an <include ... /> dla układu, który jest zawinięty (patrz 2) i android.wsparcie.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 jest tylko LinearLayout z orientation = vertical dla nagłówka Twojego rysownika nawigacyjnego.

Activity_main_drawer jest menu XML w katalogu res/menu. Może zawierać elementy i grupy do wyboru. Jeśli korzystasz z galerii AndroidStudio, Kreator stworzy dla Ciebie podstawową i możesz zobaczyć, jakie masz opcje.

  1. Układ paska aplikacji zwykle jest teraz Androidem.wsparcie.design.widget.Koordynatorlayout i to będzie obejmować dwoje dzieci: android.wsparcie.design.widget.AppBarLayout (który zawiera Androida.wsparcie.v7.widget.Pasek narzędzi) i <include ... > dla Twojej rzeczywistej treści (patrz 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. Układ treści może być dowolnym układem, który chcesz. Jest to układ, który zawiera główną zawartość aktywności (nie wliczając szuflady nawigacyjnej ani paska aplikacji).

Teraz, fajna rzecz o wszystko to polega na tym, że możesz zawinąć każdą aktywność w te dwa układy, ale Widok nawigacyjny (patrz krok 1) zawsze wskazuje na activity_main_drawer (lub cokolwiek innego). Oznacza to, że będziesz mieć tę samą szufladę nawigacyjną(*) we wszystkich aktywnościach.

  • nie będą to same instancje Z NavigationView, ale, szczerze mówiąc, nie było to możliwe nawet przy opisanym powyżej rozwiązaniu BaseActivity.
 5
Author: jwehrle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-06 22:33:19

Istnieje obejście: w mojej implementacji: mam fragmenty w pierwszym ćwiczeniu, które ma szufladę nawigacyjną. Pozostałe czynności tworzą pasek akcji i szufladę nawigacyjną z tego samego kodu co pierwsza czynność i nie mają fragmentów, układ jest opisany później tutaj. W pierwszym ćwiczeniu kliknięcie akcji elementu jest obsługiwane w tym samym ćwiczeniu, a w innych ćwiczeniach operacja jest zakończona później, najpierw przełączam się na pierwsze ćwiczenie, zamykając drugie działania. Warunki są następujące:

  1. Umieściłem główny układ i wewnątrz pierwszy framelayout, a drugi FrameLayout jest dedykowany do szuflady w Szuflayout.

  2. Zrobiłem inicjalizację szuflady w onResume działań innych niż pierwsza. Dzieje się tak, ponieważ musi ponownie zainicjować po nowych aktualizacjach intencji, ponieważ wszystkie działania są pojedynczą instancją.

W ten sposób udało mi się mieć nawigację i ActionBarCompat we wszystkich działaniach.

Odwrotnie może być: w ogóle nie używaj działań, zamiast tego używaj fragmentów i zastępuj je w kontenerze (na przykład układ liniowy), w którym pokazujesz swój pierwszy fragment.

Kod jest dostępny w samouczkach dla programistów Androida, wystarczy dostosować.

Http://developer.android.com/training/implementing-navigation/nav-drawer.html

Wskazane jest, aby używać coraz więcej fragmentów w aplikacja, i nie powinno być tylko trzy działania lokalne do aplikacji, że wspominasz w AndroidManifest.xml poza zewnętrznymi (np. FacebookActivity):

  1. SplashActivity: nie używa fragmentu i używa motywu pełnoekranowego.

  2. LoginSignUpActivity: nie wymaga w ogóle NavigationDrawer, więc po prostu użyj zwykłego paska narzędzi, ale co najmniej 3 lub 4 fragmenty będą wymagane. Uses noactionbar theme

  3. Strona główna lub DashBoardActivity: używa motywu noactionbar. Tutaj potrzebujesz szuflady nawigacji, również wszystkie ekrany, które następują będą fragmentami lub fragmentami zagnieżdżonymi, aż do widoku liścia. Wszystkie ustawienia, profil użytkownika itp. będą tu jako fragmenty, w tej działalności.

[dalsze wskazówki Patrz: https://stackoverflow.com/a/51100507/787399 ]

Szczęśliwego Kodowania !!

 4
Author: Abhinav Saxena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-05 05:40:05

najprostszy sposób na ponowne użycie wspólnej szuflady nawigacyjnej wśród grupy działań

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
Author: Levon Petrosyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 16:16:40

Zaktualizuj ten kod w baseactivity. i nie zapomnij dołączyć drawer_list_header do swojego XML activity.

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);

I nie używaj request () w swojej aktywności. ale nadal szuflada nie jest widoczna po kliknięciu obrazu..i przeciągając będzie widoczny bez elementów listy. próbowałem wiele, ale bez powodzenia. potrzebuję do tego trochę ćwiczeń...

 1
Author: M S Gadag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-08 10:01:08

Z @ Kevin van Mierlo ' s odpowiedź, jesteś również w stanie wdrożyć kilka szuflad. Na przykład, domyślne menu znajdujące się po lewej stronie (start) i dalsze opcjonalne menu, znajdujące się po prawej stronie, które jest wyświetlane tylko po załadowaniu określonych fragmentów.

Udało mi się to zrobić.

 1
Author: russellhoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-28 10:26:51
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();







    }

Użyj tego na pasku narzędzi.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>

Użyj tego do nagłówka nawigacyjnego, jeśli chcesz użyć

<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
Author: Volverine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 13:23:12

Robię to w Kotlinie tak:

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

Działania dla szuflady muszą dziedziczyć to BaseAppCompatActivity, wywołać super.onCreate Po ustawieniu zawartości (w rzeczywistości można je przenieść do jakiejś metody init) i mieć odpowiednie elementy dla ID w swoim układzie

 1
Author: Pavlus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 18:45:51

Utwórz szufladę nawigacyjną w swojej głównej aktywności za pomocą fragmentu.
Zainicjalizuj szufladę nawigacyjną w MainActivity
teraz we wszystkich innych czynnościach, które chcesz użyć tej samej szuflady nawigacyjnej, umieść szufladę jako bazę i fragment jako szufladę nawigacyjną. Wystarczy ustawić android: name w swoim fragmencie wskazującym na plik JAVA fragmentu. Nie trzeba inicjować fragmentu w innych czynnościach.
Możesz uzyskać dostęp do szuflady nawigacyjnej, przesuwając palcem w innych działaniach, takich jak w aplikacji Sklepu Google Play

 -1
Author: droidlabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 14:33:43