首页 文章

不同活动中的相同导航抽屉

提问于
浏览
185

我制作了一个工作的导航抽屉,如developer.android.com网站上的教程所示 . 但现在,我想使用一个导航抽屉,我在NavigationDrawer.class中为我的应用程序中的多个活动创建 .

我的问题是,如果这里有人可以制作一个小教程,这解释了如何使用一个导航抽屉进行多个活动 .

我先在这个答案中阅读了Android Navigation Drawer on multiple Activities

但它对我的项目不起作用

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

在这个活动中,我希望有导航抽屉,所以我扩展了'NavigationDrawer',在其他一些活动中,我希望用户使用相同的导航抽屉

public class SampleActivity extends NavigationDrawer {...}

我不知道要改变什么......

11 回答

  • 163

    所以这个答案是迟了几年但有人可能会欣赏它 . Android为我们提供了一个新的小部件,可以更轻松地使用一个导航抽屉和多个活动 .

    android.support.design.widget.NavigationView是模块化的,在菜单文件夹中有自己的布局 . 您使用它的方式是以下列方式包装xml布局:

    • Root Layout是一个android.support.v4.widget.DrawerLayout,它包含两个子节点:一个 <include ... /> 用于正在包装的布局(参见2)和一个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只是一个LinearLayout,其orientationInd为vertical,用于导航Drawar的 Headers .

    activity_main_drawer是res / menu目录中的菜单xml . 它可以包含您选择的项目和组 . 如果您使用AndroidStudio图库,向导将为您制作一个基本的向导,您可以看到您的选项 .

    • 应用程序栏布局现在通常是android.support.design.widget.CoordinatorLayout,这将包括两个子项:android.support.design.widget.AppBarLayout(包含android.support.v7.widget.Toolbar)和 <include ... > 为您的实际内容(见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" />
    
    • 内容布局可以是您想要的任何布局 . 这是包含活动主要内容的布局(不包括导航抽屉或应用栏) .

    现在,关于所有这些的一件很酷的事情是,您可以将这两个布局中的每个活动包装起来,但让您的NavigationView(请参阅步骤1)始终指向activity_main_drawer(或其他) . 这意味着您将在所有活动中使用相同的(*)导航抽屉 .

    • 它们不是NavigationView的同一个实例,但公平地说,即使使用上面概述的BaseActivity解决方案也是如此 .
  • 1

    有一个解决方法:在我的实现中:我在第一个具有导航抽屉的活动中有片段 . 其他活动使用与第一个活动相同的代码创建ActionBar和导航抽屉,并且它们没有碎片,布局将在后面描述 . 在第一个活动中,项目的操作点击在同一活动中处理,而在其他活动中,操作稍后完成,首先我通过关闭其他活动切换到第一个活动 . 条件如下:

    • 我已将主要布局放在第一个framelayout内,第二个framelayout专用于DrawerLayout中的Drawer .

    • 我在第一个活动以外的活动的onResume上完成了抽屉初始化 . 这是因为它需要在新的意图更新后重新初始化,因为所有活动都是单个实例 .

    通过这种方式,我可以在所有活动中使用NavigationDrawer和ActionBarCompat .

    反过来可能是:根本不使用活动,而是使用片段,并在显示第一个片段的容器(例如,线性布局)中替换它们 .

    代码在Android Developer Tutorials中提供,您只需自定义即可 .

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

    建议您在应用程序中使用越来越多的片段,应用程序本地应该只有三个活动,您在AndroidManifest.xml中提到的除了外部活动之外(例如FacebookActivity):

    • SplashActivity:不使用片段,并使用FullScreen主题 .

    • LoginSignUpActivity:根本不需要NavigationDrawer,所以只需使用普通工具栏,但至少需要3或4个片段 . 使用noactionbar主题

    • HomeActivity或DashBoardActivity:使用noactionbar主题 . 在这里您需要导航抽屉,随后的所有屏幕都将是片段或嵌套片段,直到叶子视图 . 在此活动中,所有设置,用户配置文件等都将作为片段 .

    [有关进一步指导,请参阅:https://stackoverflow.com/a/51100507/787399]

    快乐编码!!

  • -1

    有了@Kevin van Mierlo的回答,你也可以实现几个抽屉 . 例如,默认菜单位于左侧(开始),另一个可选菜单位于右侧,仅在加载确定片段时显示 .

    我已经能够做到这一点 .

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

    将它用于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>
    

    如果愿意,可以将其用于导航 Headers 使用

    <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

    我在Kotlin这样做:

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

    抽屉的活动必须继承此 BaseAppCompatActivity ,在设置内容后调用 super.onCreate (实际上,可以移动到某个init方法)并在其布局中具有相应的ID元素

  • 6

    如果您想要导航抽屉,则应使用片段 . 我上周遵循了本教程,效果很好:

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

    您还可以从本教程下载示例代码,以了解如何执行此操作 .


    没有片段:

    这是您的BaseActivity代码:

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

    需要具有导航抽屉的所有其他活动应该扩展此活动而不是活动本身,例如:

    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:

    我自己遇到了一些困难,所以如果你得到NullPointerExceptions,这里有一个解决方案 . 在BaseActivity中,将onCreate函数更改为 protected void onCreateDrawer() . 其余的可以保持不变 . 在扩展BaseActivity的活动中,按以下顺序放置代码:

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

    这有助于我解决我的问题,希望它有所帮助!

    如果您有任何问题可以随意提问,这就是您可以创建具有多个活动的导航抽屉的方法 .


    Edit 2:

    正如@GregDan所说,您的 BaseActivity 也可以覆盖 setContentView() 并在那里调用onCreateDrawer:

    @Override 
    public void setContentView(@LayoutRes int layoutResID) 
    { 
        super.setContentView(layoutResID); 
        onCreateDrawer() ;
    }
    
  • 1

    我是Google I/O 2014应用程序中的've found the best implementation. It' .

    他们使用与Kevin 's. If you can abstract yourself from all unneeded stuff in I/O app, you could extract everything you need and it is assured by Google that it'相同的方法正确使用导航抽屉图案 . 每个活动都可选择 DrawerLayout 作为其主要布局 . 有趣的部分是如何完成导航到其他屏幕 . 它在_475286中实现,如下所示:

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

    这与通过片段事务替换当前片段的常见方式不同 . 但是用户没有发现视觉差异 .

  • 32

    Easiest way to reuse a common Navigation drawer among a group of activities

    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

    在baseactivity中更新此代码 . 并且不要忘记在您的活动xml中包含drawer_list_header .

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

    并且不要在您的活动中使用request() . 但是在单击图像时仍然看不到抽屉......通过拖动它将在没有列表项的情况下可见 . 我尝试了很多但没有成功 . 需要一些锻炼...

  • 5

    对于任何想要做原始海报所要求的人,请考虑使用片段而不是凯文所说的方式 . 这是一个关于如何做到这一点的优秀教程:

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

    如果您选择使用活动而不是片段,则每次导航到新活动时都会遇到导航抽屉被重新创建的问题 . 这导致每次导航抽屉的丑陋/慢速渲染 .

  • 1

    使用片段在MainActivity中创建导航抽屉 .
    在MainActivity中初始化导航抽屉
    现在在你想要使用相同导航抽屉的所有其他活动中,将DrawerLayout作为基础,将片段作为导航抽屉 . 只需在片段中设置指向您的片段Java文件的android:name . 您不需要在其他活动中初始化片段 .
    您可以在Google Play商店应用等其他活动中通过滑动访问Nav Drawer

相关问题