3

私が開発中のアプリでは、ユーザー入力後に UI をリロードしたいと考えていました (基本的には、変更を加えた後に完全にリセットします)。アクティビティの破棄/再作成を避けて、代わりに使用したかったsetContentView()のは、はるかに高速だからです。

ただし、それを行うと問題が発生します。新しく作成された UI は を尊重せず、fitsSystemWindows="true"その一部が Android のステータス バーの後ろに表示されます。

私はそれをテストするためにそのコード例に煮詰めることができました:

レイアウト.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);
    }
}

アプリをロードすると、予期されるレイアウトが表示されます。これは、画面上部のステータス バーのすぐ下にあるシンプルなボタンです。

ここに画像の説明を入力

ただし、もう一度呼び出すボタンをクリックするとsetContentView(同じ XML が表示されます)、ボタンはステータス バーの後ろに表示されます。

ここに画像の説明を入力

何が起こるかを確認するために呼び出すmainContainer.getMeasuredHeight()と、アプリの最初の起動時に 1848px になります (高さ 1920px の画面で、その高さは画面全体よりも 72px 小さく、72px はステータス バーの高さです)、setContentView を呼び出すと、繰り返しますが、mainContainer.getMeasuredHeight()1920pxになります。

ここで何か不足していますか?mainContainer を高さ 1848 ピクセル、上部パディングを 72 ピクセルにすることもできますが、このような醜いハックは避けたいと思います。

4

2 に答える 2

0

私も同じ問題を抱えていました。私の解決策は、を変更するrootView marginTopか、手動でpaddingTop適応することです。View

于 2017-06-02T06:14:39.310 に答える