AndroidX下如何通过代码将ActionBar的contentInset相关属性设为0dp?
解决AndroidX升级后ActionBar图标前间距过大的问题
没问题,完全可以通过代码把这两个内边距属性设置为0dp,完美解决你遇到的图标间距问题!
升级到AndroidX后,系统默认的Toolbar(ActionBar的底层实现)调整了contentInsetStart和contentInsetStartWithNavigation的默认值,这就是图标前出现大间距的原因。我们只需要在你的initializeActionBar方法中添加几行代码,直接修改这两个属性即可。
修改后的代码
这里提供两种实现方式,你可以根据自己的布局情况选择:
方式1:通过Toolbar的ID获取(推荐,更稳定)
如果你的Activity布局中显式使用了Toolbar(并且设置了ID,比如@+id/toolbar),可以用这种方式:
public static void initializeActionBar(Context context, ActionBar bar, boolean showBackButton){ if (bar != null) { bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); bar.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.wood2)); bar.setIcon(R.drawable.icon_white); //custom logo if(showBackButton){ bar.setDisplayHomeAsUpEnabled(true); } // 新增:调整ActionBar内边距,消除图标前的多余间距 if (context instanceof AppCompatActivity) { AppCompatActivity activity = (AppCompatActivity) context; Toolbar toolbar = activity.findViewById(R.id.toolbar); if (toolbar != null) { // 将0dp转换为像素值(适配不同屏幕密度) int zeroPx = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 0, context.getResources().getDisplayMetrics() ); toolbar.setContentInsetStart(zeroPx); toolbar.setContentInsetStartWithNavigation(zeroPx); } } } }
方式2:通过反射获取内部Toolbar(通用,无需依赖布局ID)
如果你的项目中使用的是默认的ActionBar(没有自定义Toolbar布局),可以用反射获取ActionBar内部的Toolbar实例:
public static void initializeActionBar(Context context, ActionBar bar, boolean showBackButton){ if (bar != null) { bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); bar.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.wood2)); bar.setIcon(R.drawable.icon_white); //custom logo if(showBackButton){ bar.setDisplayHomeAsUpEnabled(true); } // 新增:通过反射获取内部Toolbar并调整内边距 try { Field toolbarField = bar.getClass().getDeclaredField("mToolbar"); toolbarField.setAccessible(true); Toolbar toolbar = (Toolbar) toolbarField.get(bar); if (toolbar != null) { int zeroPx = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 0, context.getResources().getDisplayMetrics() ); toolbar.setContentInsetStart(zeroPx); toolbar.setContentInsetStartWithNavigation(zeroPx); } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } }
代码说明
TypedValue.applyDimension用来把0dp转换成像素值,确保在不同密度的屏幕上都能生效。setContentInsetStart:设置正常状态下(无返回按钮)内容的起始内边距。setContentInsetStartWithNavigation:设置显示返回按钮时的起始内边距,这正是你需要重点调整的属性。
这样修改后,调用ActivityTools.initializeActionBar(this,getSupportActionBar(), false);时,就能自动消除图标前的多余间距了。
内容的提问来源于stack exchange,提问作者Marshall
相关产品推荐
相关产品推荐

