1

アプリは正常に起動しますが、Select_Players ボタンをクリックしても、デバイスにダイアログ ボックスが表示されません。コードは次のとおりです。

public class MainActivity extends Activity {


    private Button selectPlayers;

            @Override
        protected void onCreate(final Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_demo);

            super.onStart();    //customize
            super.onResume();   //customize

            selectPlayers = (Button) findViewById(R.id.add_players);

            selectPlayers.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {

                    // Launch dialogbox on click
                    onCreateDialog(savedInstanceState);

                }
            });
        }

        public Dialog onCreateDialog(Bundle savedInstanceState) {

            @SuppressWarnings("rawtypes")
            final ArrayList mSelectedItems = new ArrayList();  // Where we track the selected items
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            // Set the dialog title
            builder.setTitle(R.string.select_players)

            // Specify the list array, the items to be selected by default (null for none),
            // and the listener through which to receive callbacks when items are selected
            .setMultiChoiceItems(R.array.players_name, null,
                    new DialogInterface.OnMultiChoiceClickListener() {

                @SuppressWarnings("unchecked")
                @Override
                public void onClick(DialogInterface dialog, int which,
                        boolean isChecked) {
                    if (isChecked) {
                        // If the user checked the item, add it to the selected items
                        mSelectedItems.add(which);
                    } else if (mSelectedItems.contains(which)) {
                        // Else, if the item is already in the array, remove it 
                        mSelectedItems.remove(Integer.valueOf(which));
                    }
                }
            })

            // Set the action buttons
            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int id) {

                    //CODE TO CLOSE DIALOGBOX AND START FORGE

                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int id) {

                    //CODE TO JUST CLOSE DIALOGBOX

                }
            });

            return builder.create();
        }
}

Dialog メソッドが Dialog を返すようですが、onClick の結果としてそれを表示する方法がわかりません。(参考までに、Dialog メソッドは Android dev. Web サイトから取得しました。)

ありがとうございました!

4

4 に答える 4

1

このメソッドは dialog を返すので、 onClick でこのようなものを構築する必要があります

     Dialog d = onCreateDialog(savedInstanceState);
     d.show();

あなたが試みたのは、ActivityメソッドonCreateDialog()をオーバーライドすることだと思いますが、ここに示すように、別の方法でそれを行う必要があります:

http://www.mysamplecode.com/2011/11/android-alertdialog-example-showdialog.html

于 2013-07-31T13:22:06.613 に答える
0

試す

selectPlayers.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View view) {

                // Launch dialogbox on click
                onCreateDialog(savedInstanceState);

            }
        });

View Extending オブジェクト内では常に Listener を使用してください。コードの「ビュー」を「ボタン」に変更しました。私はまだテストしていませんが、あなたのように何度もやったのを覚えていて、うまくいきました。しかし、ゴミを収集する週のハッシュマップで Android API がインライン リスナーを処理する方法に応じて、最後の数日間の問題を覚えています。これが問題である場合、解決策は非常に簡単です。リスナーを変数にアタッチし、その変数を渡します。

例:

Button.OnClickListener listener = new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                // Launch dialogbox on click
                onCreateDialog(savedInstanceState);

            }
        }; 
selectPlayers.setOnClickListener(listener)

このようにして、アクティビティはリスナーを保持し、そのインスタンスをボタンに渡します。アクティビティが削除されるか、手動で削除されるまで、ガベージコレクターはそれを削除しないでください。

ああ..「onCreateDialog」への呼び出しを見ていません。「on」で始まる最初のメソッドは、手動ではなくシステムから呼び出されるライフサイクル メソッドです。それから onCreateDialog は廃止されたと思います。この問題については、Opiatefuchs の回答を参照してください。

于 2013-07-31T13:22:52.087 に答える
0

まず、onCreate() でリスナーをボタンに設定します。

private Button selectPlayers;
    @Override
protected void onCreate(final Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_demo);

    super.onStart();    //customize
    super.onResume();   //customize

    selectPlayers = (Button) findViewById(R.id.add_players);
    //set the listener to the button
    selectPlayers.setOnClickListener(this)
}

ダイアログ ボックスのコード。

    public Dialog onCreateDialog(Bundle savedInstanceState) {
    @SuppressWarnings("rawtypes")
    final ArrayList mSelectedItems = new ArrayList();  // Where we track the selected items
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // Set the dialog title
    builder.setTitle(R.string.select_players)

    // Specify the list array, the items to be selected by default (null for none),
    // and the listener through which to receive callbacks when items are selected
    .setMultiChoiceItems(R.array.players_name, null,
            new DialogInterface.OnMultiChoiceClickListener() {

        @SuppressWarnings("unchecked")
        @Override
        public void onClick(DialogInterface dialog, int which,
                boolean isChecked) {
            if (isChecked) {
                // If the user checked the item, add it to the selected items
                mSelectedItems.add(which);
            } else if (mSelectedItems.contains(which)) {
                // Else, if the item is already in the array, remove it 
                mSelectedItems.remove(Integer.valueOf(which));
            }
        }
    })

    // Set the action buttons
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int id) {

            //CODE TO CLOSE DIALOGBOX AND START FORGE

        }
    })
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int id) {

            //CODE TO JUST CLOSE DIALOGBOX

        }
    });
    AlertDialog alert = builder.create();
    alert.show(); 

}

1 つの onClick() メソッドを持つということは、1 つのメソッドで多くのボタンなどを処理できることを意味し、if/case ステートメントを使用してそれぞれを区別します。ここで、arg0 がダイアログを呼び出すために使用されるボタンである場合、処理するメソッドを呼び出す必要があります。あなたのダイアログボックス。

public void onClick(View arg0)
{  
        if(arg0== selectPlayers){
         //Show your dialog
 }
}

これは個人的な好みです。こうすることですべてが整頓され、まとめられているように感じますが、これも私の意見にすぎません。

于 2013-07-31T13:38:58.727 に答える
0

次のように使用する必要がある show() 関数がありません...

dialog.show();

于 2013-07-31T13:31:51.843 に答える