我知道这个问题有几个答案,但是没有一个能帮我解决。
我正在开发一个具有抽屉导航(Mike Penz抽屉导航)的应用程序。通过选择任何项目,用户被导航到相应的片段。碎片完美地工作,并保持状态的方向变化。但是,其中一个片段有一个按钮,用新的片段替换当前片段。当新片段在屏幕上时,如果用户更改了设备的方向,则会显示上一个片段。
处理:抽屉物品选择>片段A>按钮>片段B>改变方向>片段A。
修改 这就是第一个片段的调用方式:(切换)
case R.string.drawer_item_a:
FragmentA A = FragmentA.newInstance();
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, A)
.commit();
break;
这是第二个片段的调用方式:
@Override
public void onClick(View v) {
FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentB B = FragmentB.newInstance();
fm.beginTransaction()
.replace(R.id.container, B, String.valueOf(R.string.settings_pin_request))
.commit();
}
抽屉
result = new Drawer()
.withActivity(this)
.withToolbar(mToolbar)
.withActionBarDrawerToggle(true)
.addDrawerItems(
new PrimaryDrawerItem().withName("FragmentA"),
new PrimaryDrawerItem().withName("FragmentB")
)
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) {
if (drawerItem instanceof Nameable) {
mCurrentDrawerItem = position;
// Display appropriate fragment
switch (((Nameable) drawerItem).getNameRes()) {
case R.string.drawer_item_a:
FragmentA A = FragmentA.newInstance();
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, A)
.commit();
break;
case R.string.drawer_item_b:
FragmentA A = FragmentA.newInstance();
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, A)
.commit();
break;
}
mToolbar.setTitle(MainActivity.this.getString(((Nameable) drawerItem).getNameRes()));
}
}
}).build();
// Set the current drawer item
result.setSelection(mCurrentDrawerItem);
onResume()方法实现用户同步的逻辑。没有为片段状态编写任何内容。
答案 0 :(得分:0)
根据问题中使用的版本回答(MaterialDrawer 的 v3.x.y 强>)。答案需要进行一些更改才能使用最新版本 MaterialDrawer v4.x.y
如果创建了应用程序而您没有激活它,则抽屉不会触发OnDrawerItemClickListener
。您可以通过withFireOnInitialOnClick(true)
标志启用此功能。这将允许您在OnDrawerItemClickListener
如果未设置,则必须在更改方向后自行设置正确的片段。
您可以使用此代码:
// Set the current drawer item
result.setSelection(mCurrentDrawerItem);
返回到您的OnDrawerItemClickListener
,只要您在上面发布的代码显示您使用基于R.string的开关。通过getNameRes()
方法。这不会真正起作用,因为您没有通过资源设置项目的名称,而是直接作为字符串。 .withName("FragmentA")
。你应该在两种情况下使用相同的。
一个更好的解决方案(我强烈建议这一点)是您切换代码并根据您在OnDrawerItemClickListener
上设置的标识符切换DrawerItems
result = new Drawer()
.withActivity(this)
.withToolbar(mToolbar)
.withActionBarDrawerToggle(true)
.addDrawerItems(
new PrimaryDrawerItem().withName("FragmentA").withIdentifier(1),
new PrimaryDrawerItem().withName("FragmentB").withIdentifier(2)
)
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) {
if(drawerItem != null) {
Fragment f = null;
switch(drawerItem.getIdentifier) {
case 1:
f = FragmentA.newInstance();
break;
case 2:
f = FragmentA.newInstance();
break;
}
if (drawerItem instanceof Nameable) {
mToolbar.setTitle(MainActivity.this.getString(((Nameable) drawerItem).getNameRes()));
}
}
}
}
}).build();