Android - ActionBar没有使用onConfigurationChanged(AppCompat)

时间:2015-09-07 08:52:07

标签: android android-actionbar android-appcompat

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

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

它可以工作,但是supportActionBar(我正在使用AppCompat)以较小的字体大小保留他的高度。

ActionBar应该在纵向上更大,在横向上更小,但它保持初始值:

  • 如果我从横向开始,动作栏保持画像
  • 如果我以纵向开始,动作栏保持大风景

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

从纵向开始 enter image description here

从横向开始 enter image description here

从横向开始,将屏幕旋转到纵向(小动作条和小字体高度) enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

编辑:

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

答案 1 :(得分:1)

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

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

代码假定您在appToolbarStyle中声明了自定义属性attrs.xml。如果您不需要,可以调整代码直接使用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();
}

答案 2 :(得分:0)

如果您想保留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>