web-dev-qa-db-ja.com

AlertDialogでポジティブボタンとネガティブボタンの順序を設定するにはどうすればよいですか?

なぜ私がこれをやりたいのかは完全に別の議論ですが、すべてのアラートダイアログの右側にプラスのボタンを配置するための最良の方法を見つける必要があります。バージョン3.0以下ではボタンは通常OK /キャンセルとして表示され、4.0以降ではキャンセル/ OKであることに注意してください。可能な限り簡単な方法でアプリケーションにキャンセル/ OKを強制的に使用させたい。アプリケーションにたくさんのAlertDialogがあります。

21
Micah Hainline

残念ながら、私はあなたができるとは思いません。ただし、 documentation を引用するには:

注:AlertDialogに追加できるのは、各ボタンタイプの1つだけです。つまり、「ポジティブ」ボタンを複数持つことはできません。これにより、可能なボタンの数が3つ(ポジティブ、ニュートラル、ネガティブ)に制限されます。これらの名前は、技術的にはボタンの実際の機能とは無関係ですが、ボタンの機能を追跡するのに役立ちます。

したがって、さまざまなボタンを好きなように変えることができます。ここに表示されているのは、切り替えられた順序です(- this からの順序付け)。

  • ICSより前のデバイスでは、ボタンの順序(左から右)はPOSITIVE-NEUTRAL-NEGATIVEでした。
  • ICSを使用する新しいデバイスでは、ボタンの順序(左から右)がNEGATIVE-NEUTRAL-POSITIVEになりました。

Build.VERSION そしてそれを使用して、実行時にどのボタンがどれであるかを決定します。

17
thegrinner

これが私の解決策です。それは私にとって仕事です。

    // Show alertDialog after building
    AlertDialog alertDialog = createAlertDialog(context);
    alertDialog.show();
    // and find positiveButton and negativeButton
    Button positiveButton = (Button) alertDialog.findViewById(Android.R.id.button1);
    Button negativeButton = (Button) alertDialog.findViewById(Android.R.id.button2);
    // then get their parent ViewGroup
    ViewGroup buttonPanelContainer = (ViewGroup) positiveButton.getParent();
    int positiveButtonIndex = buttonPanelContainer.indexOfChild(positiveButton);
    int negativeButtonIndex = buttonPanelContainer.indexOfChild(negativeButton);
    if (positiveButtonIndex < negativeButtonIndex) {
        // prepare exchange their index in ViewGroup
        buttonPanelContainer.removeView(positiveButton);
        buttonPanelContainer.removeView(negativeButton);
        buttonPanelContainer.addView(negativeButton, positiveButtonIndex);
        buttonPanelContainer.addView(positiveButton, negativeButtonIndex);
    }
7
林奕忠

AlertDialog.Builderで注文を強制します。

public class MyDialog extends AlertDialog.Builder {

    public MyDialog(Context arg0) {
        super(arg0);
    }

    @Override
    public Builder setPositiveButton(CharSequence text, OnClickListener listener) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            return super.setNegativeButton(text, listener);
        } else {
            return super.setPositiveButton(text, listener);
        }

    }

    @Override
    public Builder setNegativeButton(CharSequence text, OnClickListener listener) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            return super.setPositiveButton(text, listener);
        } else {
            return super.setNegativeButton(text, listener);
        }
    }

}
4
CelinHC

正のボタンのテキストを[キャンセル]に設定し、負のボタンを[OK]に設定できると考えましたが、それらはアルファベット順であることがわかりました。

1
Dave S

すべてのデバイスのすべてのAndroidバージョンのボタンの順序を強制するソリューションを作成しました。

これは、ダイアログのボタンのリストを画面に表示する順序で取得し、必要な順序でテキストとアクションを設定できるという考え方です。これにより、どのデバイスでも同じ順序になることが保証されます。

私の GitHubリポジトリ を確認してください

以下は、ダイアログを作成して表示する例です。

 new FixedOrderDialogFragment.Builder()
    .setLeftButtonText(R.string.left)
    .setCenterButtonText(R.string.center)
    .setRightButtonText(R.string.right)
    .setDefaultButton(FixedOrderDialogFragment.BUTTON_RIGHT)
    .setMessage(R.string.message)
    .setTitle(R.string.app_name)
    .create()
 .show(getSupportFragmentManager(), "DEMO");

アクティビティの再作成時にダイアログの状態を復元できるようにするには、所有者アクティビティがFixedOrderDialogFragment.FixedOrderDialogListenerを実装する必要があることに注意してください。

1
rude

時には完全に異なる視点が問題の解決策であるHIユーザーカルチャーです

  • Win32では、[OK]ボタンと[キャンセル]ボタンが絶対に必要です。そうしないと、ダイアログは機能しません。
  • In Androidでは、OSの「戻る」ボタンが存在するため、HIはかなり異なります(onBackPressed()thatまた、オペレーティングシステムHIで、ESC(接続された物理キーボード上のESC)を上書きすることもできます。

    • ほとんどの場合、否定/キャンセルボタンは必要ありません。
    • だからほとんどのダイアログはポジティブボタンで十分です
    • そしてボタンの注文の問題はありません、正のボタンだけですか?
    • 編集フィールドにいる場合は、edittext.setSingleLine();に設定します。 Enterキーを押すと、フォーカスが1つの正のボタンに移動します。もう一度入力し、その正のボタンを押します。
    • ユーザーがプッシュキャンセルを希望する場合は、OSの「戻る」ボタンを押します(開発者として、OS HIのコアを説明する必要はありませんユーザーへのポリシー、これはOS発行者の問題です。Androidダイアログのままにします。)
0
Jan Bergström
  • AlertDialog buttonPanelでは、3つのボタンが[Ne​​utral] [Negative] [Positive]でソートされます
  • 次に、次のコードのようにボタンを設定できます

    builder.setNeutralButton( "Negative"、listener);

    builder.setNegativeButton( "Neutral"、listener);

    builder.setPositiveButton( "Positive"、listener);

0
willkernel