5

入力を受け入れるために、 EditText フィールドを持つ AlertDialog が必要です。これ自体は非常に簡単です。ただし、このリクエストからのフォールアウトとして希望する「明白な」機能がいくつかあります。一つ一つ持っていきます。これらのことに対するより簡単な解決策を持っている人を探しています。解決策は、「怠け者が独自のカスタムダイアログを作成する」ことだと思います。

AlertDialogEditText

final EditText input = new EditText(context);
final AlertDialog dlg = new AlertDialog.Builder(this).
    setTitle("Title").
    setView(input).
    setCancelable(false).
    setPositiveButton(android.R.string.ok, new OnClickListener()
    {
        @Override
        public void onClick(final DialogInterface dialog, final int which)
        {
            /* Handle ok clicked */
            dialog.dismiss();
        }
    }).
    setNegativeButton(android.R.string.cancel, new OnClickListener()
    {
        @Override
        public void onClick(final DialogInterface dialog, final int which)
        {
            /* Handle cancel clicked */
            dialog.dismiss();
        }
    }).create();
dlg.show();

ええ、うまくいきます。その入力フィールドがすぐにフォーカスされる (そしてキーボードが表示される) といいですね。

AlertDialogEditText のコードはcreate()前後になりますdlg.show()

/** This requires API Level 8 or greater. */
dlg.setOnShowListener(new OnShowListener()
{
    @Override
    public void onShow(final DialogInterface dialog)
    {
        input.requestFocus();
        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(input, 0);
    }
});

よくやった…と思う。この焦点を絞った入力ができたので、入力IMEオプションを尊重すればいいのに...

AlertDialogEditTextカスタム IME オプションでフォーカス

input.setImeOptions(EditorInfo.IME_ACTION_DONE);
input.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event)
    {
        /** Same code here that goes in the dialog.setPositiveButton OnClickListener */
        dlg.dismiss();
        return true;
    }
});

これは本当に優れたソリューションではありませんが(コードの繰り返し)、機能します...

人々はこの問題を解決するためのより良い方法を持っていますか、それともダイアログでユーザーに小さな情報を求めることは本当にまれなのでしょうか?

4

2 に答える 2

7

OPに関するコメントによると:

にそのような繰り返しコードを含める必要はありませんOnEditorActionListener。コードを繰り返す代わりに、アクティブ化されたときに[OK]ボタンをクリックするようにOSに指示することができます。

このようなもの:

public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) {
    dlg.getButton(DialogInterface.BUTTON_POSITIVE).performClick(); // Click OK button
    return true;
}

全体として、あなたは正しいアプローチを取っていると思います(ダイアログを介した情報の収集に関するドキュメント)。コメントで述べたように、OSは(ユーザー辞書に)辞書の単語を追加するためにAlertDialogw /を使用するため、これはOSで期待される機能です。EditText

于 2012-09-05T20:45:39.547 に答える
2

いつでもActivitywithTheme.DialogテーマまたはDialogFragmentウィジェットの調整の自由度が高い に切り替えることができます。AlertDialogs情報の表示にはおそらく優れています。お役に立てれば。

于 2012-09-05T20:35:31.677 に答える