2

この標準の AlertDialog にチェックボックスを追加して、単一の選択リストを追加したい

new AlertDialog.Builder(this)
.setSingleChoiceItems(R.array.difficultyLevel_list, 1, new DialogInterface.OnClickListener() {
    @Override public void onClick(DialogInterface dialog, int which) { level = which; }
})
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
})
.setNegativeButton(android.R.string.cancel, null)
.show();

今のままでは、うまく表示されます:

ここに画像の説明を入力

カスタムレイアウトを使用するように移行しました:

<?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="wrap_content"
    android:orientation="vertical" >

    <CheckBox
        android:id="@+id/levels_keep"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:checked="false"
        android:text="@string/levels_keep" />

    <ListView
        android:id="@+id/levels_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/difficultyLevel_list"
        android:choiceMode="singleChoice" />

</LinearLayout>

このコードの使用:

LayoutInflater inflater = getLayoutInflater();
final View customView = inflater.inflate(R.layout.dialog_levels, null);
final ListView list = (ListView) customView.findViewById(R.id.levels_list);
final CheckBox keep = (CheckBox) customView.findViewById(R.id.levels_keep);
// list.setSelected(level);
list.setItemChecked(level, true); // Marks the item as checked
list.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        level = position;
    }
});

new AlertDialog.Builder(this)
.setView(customView)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        CheckBox keep = (CheckBox) findViewById(R.id.levels_keep);
        if( keep.isChecked() ) {
            Context context = PlayersActivity.this;
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
            Editor editor = sp.edit();
            editor.putString(context.getString(R.string.pref_level_key), String.valueOf(level));
            editor.commit();
        }
    }
})
.setNegativeButton(android.R.string.cancel, null)
.show();

どちらが表示されますか (リストはスクロール可能です):

ここに画像の説明を入力

私が理解できないことがいくつかあります:

  1. リストにラジオ ボタンが表示されないのはなぜですか?
  2. デフォルトのチェック項目を設定するにはどうすればよいですか? (ソリューションでコードを編集)
  3. 選択の変更を聞くにはどうすればよいですか? (コードを編集したので、その方法を見つけました)
  4. チェックボックスの四角とチェックボックスのテキストの間にパディングを追加するにはどうすればよいですか。私は android:paddingLeft を試しましたが、テキストと正方形が重なって悪化しています。私は android:drawablePadding を試してみましたが、効果はありませんでした。
  5. なぜテーマが変わったのですか?(あまり重要ではありませんが、気になるだけです)編集項目をクリックすると、テキストの色が黒くなり、行の背景に「消える」テーマの色がすべて台無しになっているようです
4

1 に答える 1

2

リストにラジオ ボタンが表示されないのはなぜですか?

android:entries属性を設定すると、レイアウトとして使用ListViewする が作成されるようです。そのレイアウトがレイアウトを完全に複製しているかどうかはわかりませんが、そうであれば、それは単なるものなので利用できません。ArrayAdaptercom.android.internal.R.layout.simple_list_item_1android.R.layout.simple_list_item_1TextViewCheckBox

デフォルトのチェック項目を設定するにはどうすればよいですか?

上記のことが正しい場合は、属性を削除し、行レイアウトとして使用するコードでentries*levels_list* のアダプターを設定します。ListViewandroid.R.layout.simple_list_item_single_choice

選択の変更を聞くにはどうすればよいですか?

レイアウトから を設定OnItemClickListenerListViewます。

チェックボックスの四角とチェックボックスのテキストの間にパディングを追加するにはどうすればよいですか。私は android:paddingLeft を試しましたが、テキストと正方形が重なって悪化しています。私は android:drawablePadding を試してみましたが、効果はありませんでした。

ただの a の代わりに単純なCheckBoxと aを使用すると、好きなように配置できます。TextViewCheckBox

なぜテーマが変わったのですか?(特に重要ではありません、興味があるだけです)

わからない。まず第一に、上で述べたようにListView、特別なレイアウトを使用しており(スタイルがどのように設定されているかわかりません)、通常のListViewコンテンツの代わりにカスタムビューを使用していますが、これもスタイルが異なる可能性があります。

ChekcBoxタイトルに が必要な場合は、 にカスタム タイトルを設定しAlertDialogて を使い続けてみsetSingleChoiceItemsませんか?

OPがソリューションで編集

Luksprogの回答に間違いなく基づいているため、ここに作業コードを投稿します。回答としてマークしたいと思います。このコードはテスト済みで、正常に動作します。

LayoutInflater inflater = getLayoutInflater();
final View customView = inflater.inflate(R.layout.dialog_levels, null);
final ListView list = (ListView) customView.findViewById(R.id.levels_list);
final CheckBox keep = (CheckBox) customView.findViewById(R.id.levels_keep);
String [] items = getResources().getStringArray(R.array.difficultyLevel_list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, items);
list.setAdapter(adapter);
list.setItemChecked(level, true);
list.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        level = position;
    }
});

new AlertDialog.Builder(this)
.setView(customView)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        MyLog.w(TAG,"Level is " + level);
        if( keep.isChecked() ) {
            Context context = PlayersActivity.this;
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
            Editor editor = sp.edit();
            editor.putString(context.getString(R.string.pref_level_key), String.valueOf(level));
            editor.commit();
        }
    }
})
.setNegativeButton(android.R.string.cancel, null)
.show();
于 2013-03-16T12:51:48.443 に答える