NavigationDrawer点击菜单项无法启动新Activity问题求助
嘿,我看了你的代码,发现两个关键错误导致菜单项点击没反应,咱们一步步来修复:
核心问题1:ID引用完全搞混了
先看你的布局文件和Java代码的对应关系:
- 在
activity_markers.xml里,DrawerLayout的ID是@+id/activity_markers,但你在Java里把mDrawerLayout赋值成了findViewById(R.id.drawer)——而这个ID对应的是NavigationView! - 更糟的是,你试图找
R.id.nav_view来获取NavigationView,但你的布局里NavigationView的ID明明是@+id/drawer,这就导致navigationView对象是null,点击监听根本没设置上!
核心问题2:DrawerLayout的结构错误
DrawerLayout要求必须包含两个子视图:第一个是主内容区域(用户平时看到的页面),第二个是侧边栏(NavigationView)。你的布局里只有NavigationView,这会导致抽屉的交互逻辑异常。
修复步骤
1. 修正布局文件(activity_markers.xml)
先把布局结构补全,并且给控件起清晰的ID避免混淆:
<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 主内容区域:必须放在第一个位置 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary"/> <!-- 这里放你原来的MarkerActivity主内容,比如地图、列表之类的 --> </LinearLayout> <!-- 侧边栏NavigationView --> <android.support.design.widget.NavigationView android:id="@+id/nav_view" app:headerLayout="@layout/header" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@color/white" app:menu="@menu/drawermenu" android:layout_gravity="start"> </android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>
2. 修正Java代码中的ID引用和逻辑
现在把Java代码里的控件引用改成和布局匹配的,同时确保监听正确设置:
public class MarkerActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_markers); getWindow().getDecorView().setBackgroundColor(Color.WHITE); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 如果你一定要隐藏Toolbar,那下面的ActionBarDrawerToggle不要传toolbar参数,改用无toolbar的构造方法 // getSupportActionBar().hide(); // 正确获取DrawerLayout对象 mDrawerLayout = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, mDrawerLayout, toolbar, R.string.open_drawer, R.string.close_drawer); mDrawerLayout.addDrawerListener(toggle); toggle.syncState(); // 正确获取NavigationView并设置点击监听 NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case R.id.map_button: Intent intent = new Intent(MarkerActivity.this, MapActivity.class); startActivity(intent); break; case R.id.comingsoon: Toast.makeText(this, "Coming soon", Toast.LENGTH_SHORT).show(); break; case R.id.comingsoon2: Toast.makeText(this, "Coming soon", Toast.LENGTH_SHORT).show(); break; } mDrawerLayout.closeDrawer(GravityCompat.START); return true; } }
3. 最后检查两个关键点
- 确保
MapActivity已经在AndroidManifest.xml里注册了,不然启动会报错:
<activity android:name=".MapActivity"/>
- 如果隐藏了Toolbar,记得把
ActionBarDrawerToggle的构造方法改成不带toolbar的版本:
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.string.open_drawer, R.string.close_drawer);
这样改完之后,你的NavigationDrawer菜单项点击应该就能正常响应,打开对应的Activity或者弹出Toast了。
内容的提问来源于stack exchange,提问作者Max Yablonskyi
相关产品推荐
相关产品推荐

