7

テキスト入力 (EditText) とその入力の下に項目のリスト (TextView-s) を含むアクティビティを作成する必要があります。ステータス バーは表示されず、ナビゲーション バーのみが表示されます。ユーザーが EditText をクリックした後、ソフト キーボードを表示する必要がありますが、システム UI は変更できません (ステータス バーは非表示、ナビゲーション バーは表示)。ユーザーは、ソフトキーボードがまだ表示されている間、ListView の一番下までスクロールできる必要があります (ListView の最後の項目を表示できるようにするため)。

問題は、この動作を実現できないことです。フラグ WindowManager.LayoutParams.FLAG_FULLSCREEN を使用した場合にのみ、ステータス バーが非表示のままになります。ただし、その場合、アクティビティのコンテンツはサイズ変更されず、キーボードは ListView の下部にあるいくつかの TextView をカバーします。私はここで多くの同様の質問を見つけましたが、私の状況を説明しているものはありません (ステータスバーが表示されない + ソフトキーボードが表示される + アクティビティのすべてのレイアウトコンテンツが表示される)。

キーボードが表示されると、Android は UI のいくつかのフラグを変更するようです。そのため、後でリセットしようとしましたが、成功しませんでした。メソッド「hideStatusBar()」の使用法を参照してください。

これが私のコードです:

レイアウト:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="EditText"/>

    <ListView
        android:id="@+id/test_list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

</LinearLayout>

アクティビティ:

public class TestActivity extends Activity {

    private ListView listView;
    private ArrayAdapter<View> adapter;
    private List<View> views = new ArrayList<>();

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

        adapter = new ArrayAdapter<View>(this, 0, views) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                return views.get(position);
            }
        };

        listView = (ListView) findViewById(R.id.test_list_view);
        listView.setAdapter(adapter);

        TextView textView = null;
        for (int i = 0; i < 50; i++) {
            textView = new TextView(this);
            textView.setText("textView - " + i);
            views.add(textView);
        }

        final View decorView = getWindow().getDecorView();
        decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                hideStatusBar("onSystemUiVisibilityChange");
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        hideStatusBar("onSystemUiVisibilityChange (delayed)");
                    }
                }, 500);
            }
        });
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        hideStatusBar("onWindowFocusChanged");
    }

    public void hideStatusBar(String place) {
        Log.i("test", "hideStatusBar - " + place);
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ;
        decorView.setSystemUiVisibility(uiOptions);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
}

AndroidManifest.xml のアクティビティ定義:

<activity
        android:name="TestActivity"
        android:label="@string/app_name"
        android:windowSoftInputMode="stateHidden|adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
</activity>

編集:

私はおそらく十分に明確ではありませんでした。これは、ソフトキーボードが表示されていない私のレイアウトのように見えるものです: img1

これは、ソフト キーボードが表示され、「getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);」という行が表示されると、次のようになります。コメントされています: img2 . ステータス バーが表示され (これが問題です)、ListView の最後の項目までスクロールできます。

ウィンドウにフラグ「WindowManager.LayoutParams.FLAG_FULLSCREEN」を追加すると、ステータスバーは透明になりますが、まだ表示され、ListView の最後の項目にスクロールできません: img3

ここで答えを見つけようとしましたが、次のいずれかの方法でフルスクリーンレイアウトを使用することを誰もが提案しています

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

またはフルスクリーンテーマを使用する

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

またはウィンドウフラグを設定することによって

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

これらのソリューションにはそれぞれ 1 つの問題があります。キーボードがレイアウトの上または上に表示されるため、ListView の最後の項目までスクロールできません。

4

0 に答える 0