How to Display Navigation Drawer in all activities?

后端 未结 8 1232
刺人心
刺人心 2020-11-27 13:39

I have a Navigation Drawer which should appear in all my activities.

I saw many questions similar to this & found a solution like Extending the Main

相关标签:
8条回答
  • 2020-11-27 14:26

    Here is my implementation.. hope it help

    FIRST, this POST is concept.

    SECOND, this is also the KEY one.

    FINALLY, Here is combination of all answer in one place


    BASE ACTIVITY

    This is a base activity for all other activity

    You can extends Activity or FragmentActivity or etc. base on your requirement.

    Navigation Drawer setup here for one time.

    public class BaseActivity extends FragmentActivity {
    
        protected DrawerLayout mDrawer;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.base_layout);
    
            mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    
            //This is about creating custom listview for navigate drawer
            //Implementation for NavigateDrawer HERE !
            ArrayList<DrawerListItem> drawerListItems = new ArrayList<DrawerListItem>();
            drawerListItems.add(new DrawerListItem(0,"AIR° DEVICES"));
            drawerListItems.add(new DrawerListItem(1,"A/C Device [1]"));
            drawerListItems.add(new DrawerListItem(1,"A/C Device [2]"));
            drawerListItems.add(new DrawerListItem(1,"A/C Device [3]"));
            drawerListItems.add(new DrawerListItem(0,"AIR° FEATURES"));
            drawerListItems.add(new DrawerListItem(2,"SLEEP MODE"));
            drawerListItems.add(new DrawerListItem(2,"TRACKING MODE"));
            drawerListItems.add(new DrawerListItem(2,"SETTINGS"));
            DrawerAdapter mDrawerAdapter = new DrawerAdapter(this, R.layout.drawer_list_header, drawerListItems);
            ListView mDrawerList = (ListView) findViewById(R.id.left_drawer);
            mDrawerList.setAdapter(mDrawerAdapter);
        }
    
    }
    

    BASE ACTIVITY XML

    This xml layout is for Navigation Drawer

    <?xml version="1.0" encoding="utf-8"?>
    
    <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">
    
        <FrameLayout
                android:id="@+id/content_frame"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
        </FrameLayout>
    
        <!-- The navigation drawer -->
        <ListView
                android:id="@+id/left_drawer"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="left"
                android:scrollingCache="false"
                android:background="@drawable/drawer_bg"
                android:divider="@null"
                android:choiceMode="singleChoice"/>
    
    </android.support.v4.widget.DrawerLayout>
    

    ALL OTHERS ACTIVITY

    Other Activity just extends BaseActivity and define code as below.

    The Navigation Drawer will appear for particular activity.

    mDrawer is form BaseActivity. it's a protected variable.

    public class Screen1 extends BaseActivity
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
            //inflate your activity layout here!
            View contentView = inflater.inflate(R.layout.screen1, null, false);
            mDrawer.addView(contentView, 0);
    
            //Do the rest as you want for each activity
        }
    

    SCREEN 1 XML SAMPLE

    Design as you wish it each activity. no more Navigation Drawer Layout !

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent">
    
    </LinearLayout>
    

    NOTE

    In this implementation, The Navigation Drawer doesn't bind with Action Bar. If you wish to do that do it in BaseActivity.Also, This guide is not cover all requirement. It's just a sample.

    0 讨论(0)
  • 2020-11-27 14:28

    I had this problem too. This is my implementation:

    activity_main.xml - the child at index 1 in the CoordinatorLayout is the content_main.xml, this I can change in code.

    <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">
    
        <android.support.design.widget.CoordinatorLayout
            android:id="@+id/coordinator"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true">
    
            <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" />**
    
            <android.support.design.widget.FloatingActionButton
                android:id="@+id/fab"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|end"
                android:layout_margin="@dimen/fab_margin"
                android:src="@android:drawable/ic_dialog_email" />
    
        </android.support.design.widget.CoordinatorLayout>
    
        <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" />
    
    </android.support.v4.widget.DrawerLayout>
    

    I've created a class that uses inflates the others activities UI:

    public class MyLayoutInflater {
    
        public void inflate(Activity activity, int LayoutResource, android.app.ActionBar getSupportActionBar, Intent getIntent){
            CoordinatorLayout coordinatorLayout = (CoordinatorLayout) activity.findViewById(R.id.coordinator);
            android.view.LayoutInflater inflater = (android.view.LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View contentView = inflater.inflate(LayoutResource, null, false);
    
            //change i so that it suits the child number in you coordinator layout
            int i = 1;
            coordinatorLayout.removeViewAt(i);
            coordinatorLayout.addView(contentView, i);
            getSupportActionBar.setTitle(actionBarTitle);
        }
    
        public void inflate(Activity activity, int LayoutResource, android.support.v7.app.ActionBar getActionBar, String actionBarTitle){
            CoordinatorLayout coordinatorLayout = (CoordinatorLayout) activity.findViewById(R.id.coordinator);
            android.view.LayoutInflater inflater = (android.view.LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View contentView = inflater.inflate(LayoutResource, null, false);
    
            //change i so that it suits the child number in you coordinator layout
            int i = 1;
            coordinatorLayout.removeViewAt(i);
            coordinatorLayout.addView(contentView, i);
            getActionBar.setTitle(actionBarTitle);
        }
    
    }
    

    Now on the other activities all you have to do is extend the MainActivity and call this method and give it the necessary parameters:

    public class AnotherActivity extends MainActivity {
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            new MyLayoutInflater().inflate(this,R.layout.content_activity_another, getSupportActionBar(), getIntent());
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题