我的应用中有7个活动。每项活动都扩展了“基础活动”。这个“Base”有一个从我的数据库生成导航项的方法。
例如:
public class ActivityA extends ActivityBase{}
public class ActivityB extends ActivityBase{}
这是ActivityBase:
public class ActivityBase extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{}
在这个ActivityBase中,我有:
从数据库中获取项目
generateDrawerItems(){}
每个项目操作
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == 1) {
Intent intent = new Intent(this, ActivityA.class);
startActivity(intent);
}
if (id == 2) {
Intent intent = new Intent(this, ActivityB.class);
startActivity(intent);
}
...
}
一切都在我的MainActivity上完美运行,但在任何其他活动中,尽管所有项都是从“generateDrawerItems”方法正确生成的,但是不会调用“onNavigationItemSelected”方法。换句话说,每个活动都有navigationDrawer,但只有在MainActivity上才有“触摸动作”。
我该怎么办?
答案 0 :(得分:1)
如果我理解正确,当你从drawerlayaout开始另一个Activity时,你会失去布局与MainActivity的既定链接。
启动后,是否为每个活动创建了DrawerLayout?
此外,我认为为我们的drawerlayoutout的每个项目开始活动将很难适应大屏幕设备。您应该查看Fragments与drawerlayout的交互,这将解决您的问题,并让您的应用程序更好地支持大屏幕。
修改强>
为此,您需要MainActivity定义DrawerLayout并包含Fragment(它将是您在活动启动时的第一个视图)。并且DrawerLayout上的每个项目都有一个片段。
更改内容:
@Override
public boolean onNavigationItemSelected(MenuItem item) {
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (id == R.id.nav_item1) {
FragOne fragment = new FragOne();
fragmentTransaction.replace(R.id.main_container, fragment)
.addToBackStack(null)
.commit();
} else if (id == R.id.nav_item2) {
FragTwo fragment = new FragTwo();
fragmentTransaction.replace(R.id.main_container, fragment)
.addToBackStack(null)
.commit();
}
...
}
抽屉将留在每个碎片上。您可以在Android studio模板中找到XML逻辑的示例。
答案 1 :(得分:0)
我发现了发生了什么事。西蒙所说的完美无缺,但如果你遇到同样的问题,也许这适合你。
问题在于抽屉触摸操作仅适用于一项活动。我停下来试图找出与其他产品有什么不同。我发现元素“android.support.design.widget.NavigationView”应该是“android.support.v4.widget.DrawerLayout”中的最后一个元素, 我只是改变它现在它的工作原理。我不知道为什么会这样,如果有人知道请告诉我们。