gpt4 book ai didi

android - 如何根据新的配置变化重新调整 View ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:01 24 4
gpt4 key购买 nike

背景

我有一个应用程序 ( here ),里面有 Admob 横幅,我不喜欢每次改变方向时横幅都会重新加载的事实,所以很长一段时间我都有相同的解决方法为此,为了避免重新创建 Activity ,从而避免重新创建 Admob View :

<activity ... android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:screenOrientation="fullUser" ...>

问题

这很好用,但它并不是真正好的解决方案,也不推荐使用。只是因为这个问题我不得不使用的解决方法(写了关于它 here )。

问题是某些 UI 元素(例如工具栏)不会根据新方向进行更改。

这会导致工具栏保持与应用程序启动时相同的高度和相同的字体大小。

纵向->横向示例:

enter image description here

如您所见,横向的高度保持较大,字体大小也保持较大。

横向->纵向示例:

enter image description here

在这里你看到了相反的情况。高度保持较小,字体大小也保持较小。

布局基本上是这样的:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/activity_app_list__drawerLayout" android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="vertical">

<FrameLayout
android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary">

<androidx.appcompat.widget.Toolbar
android:id="@+id/activity_main__toolbar" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:background="@null"
android:theme="?attr/actionBarTheme" tools:ignore="UnusedAttribute"/>
</FrameLayout>

<RelativeLayout
android:layout_width="match_parent" android:layout_height="match_parent">
<FrameLayout
android:id="@+id/activity_app_list__fragmentContainer"
android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_above="@+id/activity_app_list__adContainer"/>

<ImageView
android:layout_width="match_parent" android:layout_height="wrap_content"
android:src="@drawable/msl__action_bar_shadow"
tools:ignore="ContentDescription"/>

<FrameLayout
android:id="@+id/activity_app_list__adContainer"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
</LinearLayout>

<ScrollView
android:id="@+id/activity_app_list__drawerView" android:layout_width="240dp"
android:layout_height="match_parent" android:layout_gravity="start"
android:background="?android:attr/windowBackground">

<LinearLayout
android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="vertical">

<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/activity_app_list__appToolsContainer"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:divider="?attr/gridded_listview__divider" android:orientation="vertical"
android:showDividers="middle"
tools:ignore="MissingRegistered,UnusedAttribute"/>

<View
android:layout_width="match_parent" android:layout_height="1dp"
android:layout_marginBottom="8dp" android:layout_marginTop="8dp"
android:background="?attr/activity_app_list__drawer_lisview_divider"/>

<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/activity_app_list__usefulShortcutsContainer"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:divider="?attr/gridded_listview__divider" android:orientation="vertical"
android:showDividers="middle"
tools:ignore="MissingRegistered,UnusedAttribute"/>

<View
android:layout_width="match_parent" android:layout_height="1dp"
android:layout_marginBottom="8dp" android:layout_marginTop="8dp"
android:background="?attr/activity_app_list__drawer_lisview_divider"/>

<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/activity_app_list__appOtherContainer"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:divider="?attr/gridded_listview__divider" android:orientation="vertical"
android:showDividers="middle"
tools:ignore="MissingRegistered,UnusedAttribute"/>
</LinearLayout>
</ScrollView>
</androidx.drawerlayout.widget.DrawerLayout>

</RelativeLayout>

我尝试过的

我尝试使用该属性将工具栏的高度重置为它应该具有的高度,但没有成功。还尝试设置工具栏标题的文本外观以获得新的方向,但没有帮助。

我也试过调用requestLayout,但是也没用。

问题

我如何告诉各种 UI 元素(例如工具栏)它应该根据新的配置更改进行更改?

作为替代方案,是否可以根据新配置应用工具栏的样式和高度,即使我使用 configChanges

最佳答案

引用:Android - ActionBar not resizing with onConfigurationChanged ( AppCompat )

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

以下代码应该适用于工具栏的支持库版本。属性 actionBarSize、titleTextAppearance 和 subtitleTextAppearance 由支持库提供。

该代码假定您在 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();
}

关于android - 如何根据新的配置变化重新调整 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51469131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com