【发布时间】:2015-02-03 10:35:54
【问题描述】:
在决定我们将使用导航抽屉或汉堡菜单之前,我有一个包含很多活动的应用程序。我不想使用片段重做整个应用程序,所以我决定采用此答案中使用的方法: Same Navigation Drawer in different Activities
编辑:现在,这个https://stackoverflow.com/a/23477100/1371585
我创建了一个名为NavDrawerBaseActivity 的基础活动。代码如下:
public class NavDrawerBaseActivity extends MyBaseActivity {
public DrawerLayout mNavDrawerLayout;
public ListView mDrawerList;
public String[] mMenuItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.navdrawer_activity);
mNavDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mMenuItems = getResources().getStringArray(R.array.optionsmenu_array);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mMenuItems);
mDrawerList.setAdapter(adapter);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener(this));
super.onCreate(savedInstanceState);
}
private class DrawerItemClickListener implements
ListView.OnItemClickListener {
private DrawerItemClickListener(Context context) {
mContext = context;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String textClicked = ((TextView) view).getText().toString();
view.setSelected(true);
if (textClicked.equalsIgnoreCase(mContext
.getString(R.string.optionsmenu_library))) {
Intent libraryIntent = new Intent(mContext,
LibraryActivity.class);
libraryIntent.putExtra("navdrawerposition", position);
startActivity(libraryIntent);
mNavDrawerLayout.closeDrawers();
mDrawerList.setItemChecked(position, true); //Not working
} else if (textClicked.equalsIgnoreCase(mContext
.getString(R.string.optionsmenu_settings))) {
// TODO: open activity and close the drawer
} else if (textClicked.equalsIgnoreCase(mContext
.getString(R.string.optionsmenu_logout))) {
// TODO: open activity and close the drawer
}
}
private Context mContext;
}
}
这里是布局文件navdrawer_activity.xml
<?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/activity_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<!-- The navigation drawer -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
/>
</android.support.v4.widget.DrawerLayout>
每个活动都扩展了NavDrawerBaseActivity,并且不使用setContentView,如下所示:
public class LibraryActivity extends NavDrawerBaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Not setting content view here, since its already set in
// NavDrawerBaseActivity
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.activity_frame);
// Inflating the Camera activity layout
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View activityView = layoutInflater
.inflate(R.layout.library_page, null, false);
// Adding the custom layout of this activity to frame layout set in
// NavDrawerBaseActivity.
frameLayout.addView(activityView);
// Only this part of the code is doing what I want.
// int drawerSelectedPosition = getIntent().getIntExtra(mNavDrawerPosExtraName, -1);
// if(drawerSelectedPosition > -1){
// mDrawerList.setItemChecked(drawerSelectedPosition, true);
// }
}
}
我的问题:如何在 NavDrawer 视图中正确突出显示当前活动?
mDrawerList.setItemChecked(position, true); 在 Intent 启动前或启动后不起作用。
奇怪的是:如果我当前在 Activity1,打开 NavDrawer 并选择 Activity2。我登陆Activity2,打开NavDrawer,看到“Activity2”没有被选中。我单击返回按钮,进入 Activity1,打开 NavDrawer 并看到“Activity2”被选中。
这意味着setItemChecked 有效,但在启动的新活动中无效。
目前我将该位置作为 Intent extra 传递,并专门设置选中的位置,如 LibraryActivity 中的注释部分。
这可行,但似乎可以解决。请告诉我在 NavDrawerBaseActivity 类而不是在扩展它的每个 Activity 中是否有正确/更好的方法。
【问题讨论】: