web-dev-qa-db-ja.com

キーボードディスプレイでAlertDialogのサイズを変更する方法

AlertDialogボックスに約10個のコントロール(テキストとTextView)があります。これらのコントロールはScrollViewAlertDialogにあり、プラスとマイナスの2つのボタンがあります。私が抱えている問題は、ソフトキーボードがポップアップするときに、2つのボタンがキーボードの後ろに隠れていることです。

私は内部のビューまたはダイアログボックスで再描画関数のようなものを探していました。以下は私が話しているスクリーンショットです。

enter image description here

33
Sanj

ダイアログがDialogテーマの1つを使用するアクティビティであった場合、アクティビティのadjustResizeパラメータにwindowSoftInputModeフラグを設定することにより、この動作に影響を与えることができます。

私が使用しています:

Android:windowSoftInputMode="adjustResize|stateHidden"

このフラグは通常のダイアログで引き続き使用できると思いますが、どのように適用するかわかりません。適切な親テーマを継承し、そのフラグを設定するカスタムテーマを使用してAlertDialogを作成する必要がある場合や、ContextThemeWrappersなどを使用する必要がある場合があります。

または、単に Window#setSoftInputMode を使用することもできます。

alertDialog.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
99
nmr

これを処理する最良の方法を見つけました。これはダイアログなので、コードは

alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

うまく機能しません。

このコードの他に、このダイアログのダイアログスタイルを設定する必要があります。スタイルは以下のようになります。

<style name="DialogStyle" parent="@Android:style/Theme.Black.NoTitleBar.Fullscreen">
    <item name="Android:windowFullscreen">false</item>
    ......
    ......
</style>

属性parentTheme.Black.NoTitleBar.Fullscreenアクティビティのスタイルに似ています。および属性Android:windowFullScreenfalseである必要があります。

これで、ソフトキーボードが切り替わると、ダイアログのサイズが変更されます。

15
Nick

adjustPan以外は何もうまくいきませんでした

ドキュメントに従って

アクティビティのメインウィンドウは、ソフトキーボード用のスペースを確保するためにサイズ変更されません。むしろ、ウィンドウのコンテンツは自動的にパンされるので、現在のフォーカスがキーボードによって隠されることはなく、ユーザーは入力内容を常に確認できます。ユーザーがウィンドウの隠れた部分にアクセスして操作するには、ユーザーがソフトキーボードを閉じる必要がある場合があるため、これは一般にサイズ変更よりも望ましくありません。

したがって、次のようにonCreate()またはonCreateView()メソッドで使用するだけです。

getDialog().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

または単にAndroid:windowSoftInputMode="adjustPan"ダイアログで遊んでいるActiviryのマニフェスト

Android:windowSoftInputMode="adjustResize|stateHidden"各edittextで、ユーザーが次のテキストボックスに簡単に移動できるようにします。

覚えておくべきポイント

MATCH_PARENTを使用してダイアログを全画面表示にしないでください。adjustPanはここでは機能しません。ダイアログを画面に合わせるようにしたい場合は、高さを0.96(これ以下)までのポイントを使用して、キーボードがedittextに正しく到達するようにします。私は以下のようにしました:

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        //int height = ViewGroup.LayoutParams.MATCH_PARENT;
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        Display display = getActivity().getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        //int width = (int)(size.x * 0.96);
        int h = (int)(size.y * 0.96);

        dialog.getWindow().setLayout(width, h);
    }
}

見て、私が全高(MATCH_PARENT)を使用する場合、soft_keyboardはダイアログをスクイーズします。しかし、高さ(ここでは、match_parentにほぼ近い0.96)にポイントを使用すると、適切に機能します。

それが誰かを助けることを願っています:)

3
Ranjit

多分あなたはダイアログのサイズを変更する必要はありません

android:imeOptions = "actionNext"をEditText(最後を除くすべて)に追加します(キーボードに[次へ]ボタンが追加されます-次のEditTextに移動します)

最後のEditTextにAndroid:imeOptions = "actionDone"を追加します(「完了」ボタン-キーボードを非表示)

これでユーザーはボタンをクリックできるはずです

コードでテキストボックスを作成する場合は、EditText#setImeOptions関数を使用します

HTH

1
Selvin

あなたはそれをポップアップとして持つことを強いられていますか?ポップアップは非常に大きく見えるので、別のアクティビティとして表示したいだけかもしれません。一般に、ポップアップは、完全なデータ入力フォームではなく、いくつかのオプションを備えた簡単な質問またはステートメントを提供するために使用されます。大きなポップアップの背後に多くを表示することはできないため、いずれにしても、基礎となるコントロールを公開していません。

1
Stealth Rabbi

すぐにキーボードを表示してサイズを調整するには:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        }
    }
});
0
Samad