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

我做了一个工作导航抽屉,就像它在developer.android.com网站上的教程中显示的那样。但是现在,我想使用一个导航抽屉,我在NavigationDrawer.class中创建了多个活动在我的应用程序。

我的问题是,这里是否有人可以做一个小教程,它解释了如何使用一个导航抽屉的多个活动。

我先读了这个答案 Android导航抽屉在多个活动 < / p >

但在我的项目上行不通

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


listItems = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text,
listItems));
    

drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
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 {...}
246815 次浏览
如果你想要一个导航抽屉,你应该使用片段。 上周我遵循了这个教程,它工作得很好:

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>

编辑:

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

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

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

这就是如何创建具有多个活动的导航抽屉,如果您有任何问题,请随时询问。


编辑2:

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

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

我的建议是:完全不要使用活动,而是使用片段,并将它们替换到容器中(例如线性布局),在其中显示您的第一个片段。

代码可以在Android开发者教程中找到,你只需要自定义。

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

这是明智的,你应该在你的应用程序中使用越来越多的片段,应该只有四个基本的活动,你在你的AndroidManifest.xml中提到除了外部的(例如FacebookActivity):

  1. SplashActivity:不使用片段,使用全屏主题。

  2. LoginSignUpActivity:根本不需要NavigationDrawer,也没有后退按钮,所以只需使用普通的工具栏,但至少需要3或4个片段。使用无动作栏主题

  3. HomeActivity或DashBoard Activity:使用无操作栏主题。这里你需要导航抽屉,接下来的所有屏幕都是片段或嵌套片段,直到叶子视图,共享抽屉。所有的设置,用户配置文件等将在这里作为片段,在这个活动。 这里的片段不会被添加到后面的堆栈中,而是从抽屉菜单项中打开。对于需要返回按钮而不是抽屉的片段,下面有第四种活动。

  4. 没有抽屉的活动。该活动顶部有一个后退按钮,其中的片段将共享相同的操作栏。这些片段将被添加到后台堆栈,因为会有一个导航历史。

[进一步指导参见:https://stackoverflow.com/a/51100507/787399]

快乐编码!!

我已经找到了最好的实现。它在谷歌I/O 2014应用程序中。

他们使用和凯文一样的方法。如果你可以把自己从I/O应用程序中所有不需要的东西中抽象出来,你可以提取你需要的一切,谷歌保证它是导航抽屉模式的正确使用。 每个活动都有一个DrawerLayout作为它的主布局。有趣的部分是如何导航到其他屏幕。它在BaseActivity中是这样实现的:

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

这与用片段事务替换当前片段的常见方法不同。但用户并没有发现视觉上的差异。

在baseactivity中更新此代码。不要忘记在你的activity xml中包含drawer_list_header。

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

并且不要在你的活动中使用request()。但仍然是抽屉不可见点击图像..和拖动它将可见没有列表项。我尝试了很多,但没有成功。需要一些锻炼…

有了@Kevin van Mierlo的回答,您也可以实现多个抽屉。例如,位于左侧的默认菜单(start),以及位于右侧的进一步可选菜单,仅在加载确定片段时显示。

我已经做到了。

在MainActivity中使用fragment创建导航抽屉 初始化MainActivity中的导航抽屉
现在,在所有其他活动中,你想使用相同的导航抽屉,把DrawerLayout作为基础,把fragment作为导航抽屉。只需设置android:name在你的片段指向你的片段Java文件。你不需要在其他活动中初始化这个片段 你可以通过在谷歌Play Store应用程序

中的其他活动中滑动访问导航抽屉

对于任何想要做原始海报要求的人,请考虑使用片段代替凯文说的方式。这里有一个关于如何做到这一点的优秀教程:

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

如果你选择使用活动而不是片段,你会遇到每次导航到新活动时重新创建导航抽屉的问题。这导致每次导航抽屉的渲染都很难看/缓慢。

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>

如果想要使用,可以使用这个导航头

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

我在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元素

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

navigationview是模块化的,在菜单文件夹中有自己的布局。你使用它的方式是以下方式包装xml布局:

  1. 根布局是一个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" />
    

    < / p >

nav_header_main只是一个线性布局的方向=垂直为你的导航图纸的头部。

Activity_main_drawer是res/menu目录中的一个菜单XML。它可以包含您选择的项目和组。如果你使用AndroidStudio Gallery,向导会为你创建一个基本的Gallery,你可以看到你有哪些选项。

  1. 应用程序栏布局现在通常是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" />
    

    < / p >

  2. 内容布局可以是你想要的任何布局。这是包含活动的主要内容的布局(不包括导航栏或应用程序栏)。

现在,最酷的事情是,你可以在这两个布局中包装每个活动,但你的NavigationView(见步骤1)总是指向activity_main_drawer(或其他什么)。这意味着您将在所有活动上拥有相同的(*)导航抽屉。

  • 它们不会是相同的NavigationView的实例,但是,公平地说,即使是上面概述的BaseActivity解决方案,这也是不可能的。

在一组活动中重用公共导航抽屉的最简单方法

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

我的答案只是一个概念性的答案,没有任何源代码。这对一些像我这样的读者来说可能是有用的。

这取决于你最初构建应用的方法。基本上有两种方法。

  1. 您创建一个活动(基本活动),所有其他视图和屏幕都将是片段。该基本活动包含抽屉布局和协调器布局的实现。这实际上是我喜欢的方式,因为拥有小的自包含片段将使应用程序开发更容易和更流畅。

  2. 如果你已经开始了你的应用程序开发活动,每个屏幕一个,那么你可能会创建基本活动,所有其他活动从它扩展。基本活动将包含抽屉和协调器实现的代码。任何需要抽屉实现的活动都可以从基本活动扩展。

我个人更倾向于避免在没有任何组织的情况下混合使用片段和活动。这让开发变得更加困难,最终让你陷入困境。如果你已经这样做了,重构你的代码。

这将在接下来的视频教程中详细阐述

< a href = " https://youtu。be/pRieCkF1Yts" rel="nofollow noreferrer">使用基本活动的多个活动的导航抽屉

创建一个基本导航抽屉活动,并将这个基本导航抽屉活动扩展到你想要显示导航抽屉的所有活动是非常容易的,

  1. 制作导航菜单,标题
  2. 为导航抽屉创建一个基本活动
  3. 创建内容布局
  4. 组合菜单,标题,内容布局的基础活动
  5. 通过使用框架布局,在抽屉菜单中插入每个活动。

所有步骤在视频中都有清楚的解释