自定义ActionBar主页按钮无响应,无法打开导航抽屉怎么解决?
我帮你排查了下代码,发现两个关键问题导致Home按钮点击没反应:
1. 布局结构错误
你的原布局把DrawerLayout和包含Toolbar的LinearLayout放在了RelativeLayout的同级位置,而且DrawerLayout是match_parent宽高,这会导致它覆盖在Toolbar上方——虽然视觉上Toolbar显示在前面,但事件传递会被干扰。DrawerLayout的正确用法是作为根布局,内部第一个子元素是你的主内容区域(包含Toolbar),第二个子元素是NavigationView。
2. 缺少Toolbar与DrawerLayout的关联
仅仅设置setDisplayHomeAsUpEnabled(true)不足以让Home按钮联动DrawerLayout,Android提供了ActionBarDrawerToggle工具类,它可以自动处理Home按钮的点击事件,还能同步菜单图标的切换动画,体验更流畅。
修改后的完整代码
activity_main.xml
<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/main_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="android.example.com.errorhomeasupbutton.MainActivity"> <!-- 主内容区域:包含Toolbar和其他页面内容 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/main_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" app:title="@string/app_name" app:titleTextColor="@android:color/white"/> <!-- 这里可以添加你的页面其他内容 --> </LinearLayout> <!-- 侧边栏NavigationView --> <android.support.design.widget.NavigationView android:id="@+id/main_nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/main_nav_view_header" app:menu="@menu/main_nav_view_menu"/> </android.support.v4.widget.DrawerLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity { private DrawerLayout drawerLayout; private ActionBarDrawerToggle drawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.main_toolbar); setSupportActionBar(toolbar); drawerLayout = findViewById(R.id.main_drawer_layout); // 初始化DrawerToggle,关联Toolbar和DrawerLayout drawerToggle = new ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ); // 给DrawerLayout添加状态监听器 drawerLayout.addDrawerListener(drawerToggle); // 同步Toggle的初始状态 drawerToggle.syncState(); } // 屏幕配置变化时(比如旋转),同步Toggle状态 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); drawerToggle.onConfigurationChanged(newConfig); } // 让DrawerToggle优先处理ActionBar菜单点击事件 @Override public boolean onOptionsItemSelected(MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } }
额外注意事项
别忘了在strings.xml中添加两个字符串(如果还没有的话),用于辅助功能:
<string name="navigation_drawer_open">打开侧边栏</string> <string name="navigation_drawer_close">关闭侧边栏</string>
这样修改后,点击Toolbar上的Home按钮就能正常打开Navigation Drawer了,而且还会有图标切换的动画效果~
内容的提问来源于stack exchange,提问作者txpecel
相关产品推荐
相关产品推荐

