gpt4 book ai didi

android - fitsSystemWindows ="true"在调用 setContentView() 后不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:52 25 4
gpt4 key购买 nike

对于我正在开发的应用程序,我想在用户输入后重新加载 UI(基本上是在他们对其进行更改后将其完全重置)。我想尝试避免破坏/重新创建 Activity 并改用 setContentView() 因为它要快得多。

但是,当我这样做时,我遇到了一个问题:新创建的 UI 不符合 fitsSystemWindows="true" 并且它的一部分最终出现在 android 的状态栏后面。

我设法将其归结为该代码示例以对其进行测试:

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/mainContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<Button
android:text="Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button" />
</LinearLayout>

MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
reloadUI();
}
});

}

public void reloadUI() {
setContentView(R.layout.layout);
}
}

当我加载应用程序时,我得到了预期的布局,即屏幕顶部、状态栏正下方的一个简单按钮:

enter image description here

但是,一旦我第二次单击调用 setContentView 的按钮(显示相同的 XML),该按钮就会出现在状态栏后面:

enter image description here

调用 mainContainer.getMeasuredHeight() 检查发生了什么,在应用程序第一次启动时给我 1848px(在 1920px 高的屏幕上,所以它的高度比整个屏幕小 72px, 72px 是状态栏的高度),但是当我再次调用 setContentView 时,mainContainer.getMeasuredHeight() 给了我 1920px。

我是不是漏掉了什么?我可以强制 mainContainer 保持 1848px 的高度和 72px 的顶部填充,但我更愿意避免像这样丑陋的 hack。

最佳答案

因此,您想要的是要求框架再次将 WindowInsets 分派(dispatch)到您的 Root View 。这正是ViewCompat.requestApplyInsets(View)会做:

Ask that a new dispatch of View.onApplyWindowInsets(WindowInsets) be performed. This falls back to View.requestFitSystemWindows() where available.

只应用一行应该可以解决您所有的问题:



public void reloadUI() {
setContentView(R.layout.layout);
// `R.id.mainContainer` is the id of the root view in `R.layout.layout`
ViewCompat.requestApplyInsets(findViewById(R.id.mainContainer));
}

关于android - fitsSystemWindows ="true"在调用 setContentView() 后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956181/

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