Même tiroir de Navigation dans différentes activités

j'ai fait un tiroir de navigation de travail comme il est montré dans le tutoriel sur le developer.android.com site web. Mais maintenant, je veux utiliser un tiroir de Navigation, j'ai créé dans le Drawer de navigation.classe pour les activités multiples dans ma demande.

ma question Est, si quelqu'un ici peut faire un petit tutoriel, qui explique, comment utiliser un tiroir de Navigation pour des activités multiples.

Je l'ai lu en premier à cette réponse tiroir de Navigation Android sur les activités multiples

mais ça n'a pas marché sur mon projet

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

dans cette activité je veux avoir le tiroir de Navigation donc j'étend 'NavigationDrawer' et dans quelques autres activités je veux utiliser le même tiroir de Navigation

  public class SampleActivity extends NavigationDrawer {...}

je ne sais pas quoi changer...

183
demandé sur Community 2013-10-18 18:07:15

11 réponses

si vous voulez un tiroir de navigation, vous devez utiliser des fragments. J'ai suivi ce tutoriel la semaine dernière et il fonctionne très bien:

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

vous pouvez également télécharger le code échantillon de ce tutoriel, pour voir comment vous pouvez le faire.


sans fragments:

C'est votre activité de base 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);
    }
}

toutes les autres activités qui doivent avoir un tiroir de navigation devraient étendre cette activité au lieu de L'activité elle-même, exemple:

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>

modifier:

j'ai moi-même connu quelques difficultés, alors voici une solution si vous obtenez des exceptions nulles. Dans BaseActivity changer la fonction oncréate en protected void onCreateDrawer() . Le reste peut rester la même. Dans les activités qui étendent L'activité de base mettre le code dans cet ordre:

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

Cela m'a aidé à résoudre mon problème, j'espère que ça aide!

c'est comme ça que vous pouvez créer un tiroir de navigation avec plusieurs activités, si vous avez des questions, n'hésitez pas à les poser.


Edit 2:

Comme l'a dit @GregDan, votre BaseActivity peut aussi remplacer setContentView() et appeler un voyageur:

@Override 
public void setContentView(@LayoutRes int layoutResID) 
{ 
    super.setContentView(layoutResID); 
    onCreateDrawer() ;
}
161
répondu Kevin van Mierlo 2018-04-30 19:24:26

j'ai trouvé la meilleure implémentation. C'est dans le Google I/O 2014 app.

ils utilisent la même approche que Kevin. Si vous pouvez vous abstraire de toutes les choses inutiles dans l'application D'E/S, vous pouvez extraire tout ce dont vous avez besoin et il est assuré par Google que c'est une utilisation correcte du dessin de tiroir de navigation. Chaque activité a en option un DrawerLayout comme disposition principale. La partie intéressante est la façon dont la navigation vers d'autres écrans est faite. Il est mis en œuvre dans BaseActivity comme ceci:

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

cela diffère de la façon courante de remplacer un fragment actuel par une transaction de fragment. Mais l'utilisateur ne voit pas de différence visuelle.

32
répondu WindRider 2014-10-23 11:17:51

pour toute autre personne cherchant à faire ce que l'affiche originale demande, veuillez envisager d'utiliser des fragments plutôt que la façon dont Kevin a dit. Voici un excellent tutoriel sur la façon de faire:

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

si vous choisissez d'utiliser plutôt des activités au lieu de fragments, vous allez rencontrer le problème du tiroir nav étant recréé chaque fois que vous accédez à une nouvelle activité. Il en résulte un rendu laid/lent du tiroir nav à chaque fois.

6
répondu Micro 2016-02-03 08:28:17

donc cette réponse a quelques années de retard mais quelqu'un peut l'apprécier. Android nous a donné un nouveau widget qui rend l'utilisation d'un tiroir de navigation avec plusieurs activités plus facile.

android.soutien.conception.widget.NavigationView est modulaire et a sa propre disposition dans le dossier menu. La façon dont vous l'utilisez est d'envelopper les mises en page xml de la façon suivante:

  1. Root Layout est un android.soutien.v4.widget.DrawerLayout que contient deux enfants: un <include ... /> pour la disposition qui est enveloppé (voir 2) et un androïde.soutien.conception.widget.La fenêtre des éléments.

    <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 est juste un LinearLayout avec orientation = vertical pour l'en-tête de votre Navigation Drawar.

activity_main_drawer est un menu xml dans votre répertoire res/menu. Il peut contenir des articles et des groupes de votre choix. Si vous utilisez le AndroidStudio Gallery le magicien va faire un basique pour vous et vous pouvez voir ce que vos options sont.

  1. de la barre d'Application de mise en page est généralement maintenant un android.soutien.conception.widget.CoordinatorLayout et cela comprendra deux enfants: un androïde.soutien.conception.widget.AppBarLayout (qui contient un android.soutien.v7.widget.Toolbar) et un <include ... > pour votre contenu actuel (Voir 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. la mise en page du contenu peut être la mise en page que vous voulez. Il s'agit de la mise en page qui contient le contenu principal de l'activité (à l'exclusion du tiroir de navigation ou de la barre d'applications).

maintenant, la chose cool à propos de tout cela est que vous pouvez envelopper chaque activité dans ces deux layouts, mais avoir votre NavigationView (voir l'étape 1) toujours pointer vers activity_main_drawer (ou autre). Cela signifie que vous aurez le même tiroir de Navigation (*) sur tous les activité.

  • ils ne seront pas les mêmes instance de NavigationView mais, pour être honnête, cela n'a pas été possible même avec la solution de BaseActivity décrite ci-dessus.
5
répondu jwehrle 2017-10-06 22:33:19

il y a un travail autour: dans mon implémentation: j'ai des fragments dans la première activité qui ont un tiroir de Navigation. Les autres activités créent L'ActionBar et tiroir de Navigation à partir du même code que la première activité, et ils n'ont pas de fragments, la disposition est décrite plus loin ici. Dans la première activité, le clic action de l'élément est manipulé dans la même activité, et dans les autres activités, l'action est terminée plus tard, d'abord je passe à la première activité, en fermant la d'autres activités. Les conditions sont les suivantes:

  1. j'ai mis la disposition principale et à l'intérieur du premier framelayout, et le second framelayout est dédié au tiroir de DrawerLayout.

  2. j'ai fait l'initialisation de tiroir dans une partie des activités autres que la première. Cela est dû au fait qu'il doit être réinitialisé après la mise à jour de la nouvelle intention, puisque toutes les activités sont des instances uniques.

de cette façon, J'ai pu avoir NavigationDrawer et ActionBarCompat dans toutes les activités.

l'autre solution pourrait être: n'utilisez aucune activité, utilisez plutôt des fragments, et remplacez-les dans le conteneur (présentation linéaire par exemple) où vous montrez votre premier fragment.

Code est disponible dans les tutoriels de développeur Android, vous avez juste à personnaliser.

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

il est conseillé d'utiliser de plus en plus de fragments dans votre application, et il ne doit y avoir que trois activités locales à votre application, que vous mentionnez dans votre AndroidManifest.xml en dehors des externes (FacebookActivity par exemple):

  1. SplashActivity: n'utilise pas de fragment, et utilise le thème FullScreen.

  2. LoginSignUpActivity: Ne nécessite pas de NavigationDrawer à tous, donc tout simplement normal d'utilisation de la barre d'outil, mais à tout le moins, de 3 ou 4 fragments seront nécessaires. Utilise noactionbar thème

  3. HomeActivity ou DashBoardActivity: Utilise noactionbar thème. Ici, vous avez besoin de tiroir de Navigation, aussi tous les écrans qui suivent seront des fragments ou des fragments imbriqués, jusqu'à la vue de la feuille. Tous les paramètres, profil d'utilisateur,etc. sera ici que des fragments, dans cette activité.

[pour de plus amples informations, voir: https://stackoverflow.com/a/51100507/787399 ]

Bon Codage !!

4
répondu Abhinav Saxena 2018-07-05 05:40:05

moyen le plus facile de réutiliser un tiroir de Navigation commun parmi un groupe d'activités

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
répondu Levon Petrosyan 2018-02-09 16:16:40

mettre à jour ce code dans baseactivity. et n'oubliez pas d'inclure drawer_list_header dans votre activité xml.

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

et n'utilisez pas request() dans votre activité. mais toujours le tiroir n'est pas visible en cliquant sur l'image..et en le faisant glisser sera visible sans éléments de liste. j'ai essayé beaucoup de choses mais sans succès. besoin de quelques séances d'entraînement pour cela...

1
répondu M S Gadag 2014-11-08 10:01:08

avec la réponse de @Kevin van Mierlo, vous êtes également capable de mettre en place plusieurs tiroirs. Par exemple, le menu par défaut situé sur le côté gauche (démarrer), et un autre menu optionnel, situé sur le côté droit, qui n'est affiché que lorsque des fragments déterminés sont chargés.

j'ai pu le faire.

1
répondu russellhoff 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();







    }

utilisez ceci pour votre barre d'outils.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>

utilisez ceci pour l'en-tête de navigation si vous voulez utiliser

<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
répondu Volverine 2017-03-03 13:23:12

je le fais à Kotlin comme ceci:

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

activités pour tiroir doit hériter ce BaseAppCompatActivity , appeler super.onCreate après que le contenu est défini (en fait, peut être déplacé à une certaine méthode init) et ont des éléments correspondants pour les ID dans leur disposition

1
répondu Pavlus 2017-08-01 18:45:51

créez un tiroir de Navigation dans votre activité principale en utilisant fragment.

Initialiser le tiroir de Navigation dans MainActivity

maintenant, dans toutes les autres activités que vous voulez utiliser même tiroir de Navigation mis DrawerLayout comme base et fragment comme tiroir de navigation. Il suffit de définir android:nom dans votre fragment pointant vers votre fichier java fragment. Vous n'aurez pas besoin d'initialiser le fragment dans d'autres Activités.

Vous pouvez accéder au tiroir Nav par glisser dans d'autres activités comme dans Google Play Store app

-1
répondu droidlabel 2015-04-23 14:33:43