1

Я хочу, чтобы добавить флажок в этом стандартном AlertDialog Wiht одном списке выбораДобавление CheckBox в singlechoice набор 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(); 

Прямо сейчас, как это, это показывает, красиво:

enter image description here

я сместился использовать пользовательский макет:

<?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(); 

который показывает (список прокручивать):

enter image description here

Есть несколько вещей, которые я не могу понять:

  1. Почему я не вижу кнопки радио на список?
  2. Как установить отмеченный по умолчанию элемент? (Отредактировано код с помощью решения)
  3. Как я могу прослушать изменения в выборе? (Отредактировано код, так как я нашел, как это сделать)
  4. Как добавить отступы между квадратом флажка и текстом флажка. Я пробовал Android: paddingLeft, но это делает его хуже, перекрывая текст и квадрат. Я пробовал андроид: drawablePadding без эффекта.
  5. Почему тема изменилась? (Не очень важно, просто интересно) Edit Это кажется, что цвета темы все перепутались, когда я нажимаю на элемент его цвет текста становится черным и «исчезнуть» в фоновом режиме в строке и
+0

Пожалуйста, не префикс названия вопроса с * Android *, так как он просто добавляет шум, ярлык внизу является более чем достаточно. – Luksprog

ответ

2

Почему Я не вижу переключателей в списке?

Оказывается, что установка атрибута android:entries делает ListView создать ArrayAdapter используя com.android.internal.R.layout.simple_list_item_1 в качестве макета. Я не знаю, полностью ли этот макет реплицирует макет android.R.layout.simple_list_item_1, но если это так, то это просто TextView, поэтому нет CheckBox.

Как установить отмеченный по умолчанию элемент?

Если то, что я сказал выше верно, то удалить атрибут entries и установить адаптер для * levels_list * ListView в коде, используя android.R.layout.simple_list_item_single_choice как расположение строк.

Как я могу прослушать изменения в выборе?

Установить OnItemClickListener на ListView с планировки.

Как добавить прокладку между квадратом флажка и флажком . Я пробовал андроид: paddingLeft, но это делает его еще хуже, перекрывая текст и квадрат . Я пробовал андроид: drawablePadding без эффекта.

Используйте простой CheckBox и TextView, а не просто CheckBox, и вы можете разместить их как вам угодно.

Почему тема изменилась? (не очень важно, просто любопытно)

Я не уверен. Прежде всего, как я уже сказал выше, ListView использует специальный макет (который я не знаю, как он оформлен), а также вы используете пользовательский вид вместо обычного ListView контента, который снова может быть оформлен по-разному.

Если вы хотите получить ChekcBox в названии, почему бы не просто set a custom title на AlertDialog и продолжить использовать setSingleChoiceItems?

Под редакцией О.П. с раствором

я отправляю рабочий код здесь, так как это, безусловно, опирается на Luksprog ответ, и я хочу, чтобы пометить его как ответ. Этот код был протестирован и отлично работает.

+0

спасибо. Флажок не является заголовком, я помещаю его сверху, потому что иначе, в зависимости от устройства, он помещается вне экрана. И мне пришлось бы огибать все в вертикальном свитке, чтобы добраться до него. Таким образом, флажок всегда отображается, и ListView может прокручивать, определяя. – ilomambo

+0

@ilomambo Если вы также указали название для «AlertDialog», мой совет не пригодится. Установите адаптер для кода «ListView». Кроме того, вы не должны искать 'CheckBox' в диалоговом окне, например:' ((Диалог)) .findViewById (и т. Д.) '? Теперь это работает? – Luksprog

+0

Посмотрите мои последние изменения, я нашел решения вопросов 2 и 3, код, который я редактировал, чтобы отразить это, включает в себя получение идентификаторов вида для флажка и списка. – ilomambo