【问题标题】:Android - ActionBar not resizing with onConfigurationChanged ( AppCompat )Android - ActionBar 不使用 onConfigurationChanged ( AppCompat ) 调整大小
【发布时间】:2018-03-11 02:36:34
【问题描述】:

在我的应用程序清单中,我添加了 android:configChanges 以防止活动在旋转时重新加载/重启

<activity
  android:name=".MainActivity"
  android:label="@string/app_name"
  android:configChanges="orientation|keyboardHidden|screenSize" >

它有效,但 supportActionBar(我正在使用 AppCompat )以小字体保留他的高度。

ActionBar 纵向要大,横向要小,但保持初始值:

  • 如果我从横向开始,则操作栏在纵向时会保持纤细
  • 如果我从纵向开始,操作栏在横向保持很大

删除 android:configChanges="orientation|keyboardHidden|screenSize" 是我找到的唯一解决方案,但应用程序在旋转时重启,我需要保留应用程序内容

从纵向开始

从横向开始

从横向开始并将屏幕旋转到纵向(小操作栏和小字体高度)

【问题讨论】:

    标签: android android-actionbar android-appcompat


    【解决方案1】:

    通过设置android:configChanges="orientation|keyboardHidden|screenSize"

    您声明您将自己处理这些配置更改。在正常情况下,您不应该设置它,而让 Android 重新创建您的 Activity。

    编辑:

    如果您想保留android:configChanges 行,则必须覆盖onConfigChanged() 并更改您自己需要的所有内容,例如ActionBar/ToolBar 的大小。

    【讨论】:

    【解决方案2】:

    正如其他人指出的那样,您应该尽可能保存和恢复实例状态,而不是自己处理配置更改。如果您有充分的理由不这样做,您可以尝试在配置更改后更新工具栏的高度和文本外观。

    以下代码应该适用于Toolbar 的支持库版本。属性actionBarSizetitleTextAppearancesubtitleTextAppearance由支持库提供。

    代码假定您在attrs.xml 中声明了一个自定义属性appToolbarStyle。如果您不需要,可以修改代码以直接使用R.style.Widget_AppCompat_Toolbar

    import android.support.v7.widget.Toolbar;
    
    ...
    
    private Toolbar toolbar;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.main_activity);
    
        toolbar = findViewById(R.id.toolbar);
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        updateToolbar();
    }
    
    private void updateToolbar() {
        if (toolbar == null)
            return;
    
        final Context context = toolbar.getContext();
    
        int[] attr = new int[] { R.attr.actionBarSize, R.attr.appToolbarStyle };
        int idxActionBarSize = 0;
        int idxAppToolbarStyle = 1;
        TypedArray a = context.obtainStyledAttributes(attr);
        int actionBarSize = a.getDimensionPixelSize(idxActionBarSize, 0);
        int appToolbarStyle = a.getResourceId(idxAppToolbarStyle, R.style.Widget_AppCompat_Toolbar);
        a.recycle();
    
        if (actionBarSize != 0) {
            ViewGroup.LayoutParams layoutParams = toolbar.getLayoutParams();
            if (layoutParams != null) {
                layoutParams.height = actionBarSize;
            }
    
            toolbar.setMinimumHeight(actionBarSize);
        }
    
        attr = new int[] { R.attr.titleTextAppearance, R.attr.subtitleTextAppearance };
        int idxTitleTextAppearance = 0;
        int idxSubtitleTextAppearance = 1;
        a = context.obtainStyledAttributes(appToolbarStyle, attr);
        int titleTextAppearance = a.getResourceId(idxTitleTextAppearance, 0);
        int subtitleTextAppearance = a.getResourceId(idxSubtitleTextAppearance, 0);
        a.recycle();
    
        if (titleTextAppearance != 0) {
            toolbar.setTitleTextAppearance(context, titleTextAppearance);
        }
    
        if (subtitleTextAppearance != 0) {
            toolbar.setSubtitleTextAppearance(context, subtitleTextAppearance);
        }
    
        toolbar.requestLayout();
    }
    

    【讨论】:

      【解决方案3】:

      如果你想保留android:configChanges,你可以使用它来强制56dp工具栏高度,对齐图标和修复小文本问题:

      工具栏 XML:

          <android.support.v7.widget.Toolbar
              android:id="@+id/toolbar"
              android:layout_width="match_parent"
              android:layout_height="56dp"
              android:minHeight="56dp"
              android:background="?attr/colorPrimary"
              app:popupTheme="@style/AppTheme.PopupOverlay"
              app:titleTextAppearance="@style/titleTextAppearance" />
      

      样式 XML:

      <style name="titleTextAppearance" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
          <item name="android:textSize">20sp</item>
      </style>
      

      【讨论】:

      • 注意,sw600dp 的默认值应该是64dp
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      相关资源
      最近更新 更多