Intereting Posts
Бесконечный цикл активности при переключении Bluetooth Извлечь (разобрать) сумму и описание из БИЗ (Сделка) смс Как заблокировать ориентацию экрана для телефона, но не для планшета? (Android) Как программно делать снимок экрана? Android: очистить список в Listadapter Как создать простой разделитель в новом навигационном экране? Дополнительные разрешения, чтобы приложение отображалось на всех устройствах и включало дополнительные функции на некоторых устройствах? Android Button Position Programmatically Список разрешений Android для обычных разрешений и опасных разрешений в API 23? Что отличается между type_gyroscope и type_gyroscope_uncalibrated? Кнопка Android с текстом и изображением Странное поведение параметризованного SQLite-запроса Android, как получить доступ к данным местоположения в jpg EditText в ListView без его ввода в исходное состояние Android: Intent.EXTRA_ALLOW_MULTIPLE позволяет использовать только один набор

AlertDialog – не удалять по элементу click

ОК, поэтому я создаю ArrayAdapter и использую его в своем диалоговом окне Alert, потому что я не хочу показывать переключатели по умолчанию в диалоговом окне SingleItemSelection.

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

private void showAlertDialog() { final String[] options = getResources().getStringArray(R.array.dialog_options); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, options); AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); dialogBuilder.setTitle("My Dialog"); dialogBuilder.setAdapter(adapter, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(getApplicationContext(), "item clicked at index " + which, Toast.LENGTH_LONG).show(); // Here I need to change the background color of the item selected and prevent the dialog from being dismissed } }); //String strOkay = getString(R.string.okay); dialogBuilder.setPositiveButton("OK", null); // TODO dialogBuilder.setNegativeButton("Cancel", null); // nothing simply dismiss AlertDialog dialog = dialogBuilder.create(); dialog.show(); } 

Я пытаюсь решить две проблемы.

Как запретить отклонение диалога, когда пользователь нажимает на элемент

Как изменить фон элемента, который был выбран, когда пользователь нажимает на него

Чтобы предотвратить отключение диалога при нажатии на элемент, вы можете использовать AdapterView .OnItemClickListener вместо DialogInterface .OnClickListener.

Как это:

 dialogBuilder.setAdapter(adapter, null); ... AlertDialog dialog = dialogBuilder.create(); alertDialog.getListView().setOnItemClickListener( new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // do your staff here } }); 
  1. Вы можете настроить пользовательский ListView как содержимое AlertDialog и установить OnItemClickListener

     AlertDialog.Builder builder = new AlertDialog.Builder(this); String[] items = ...; ListView list = new ListView(this); list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, items)); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View view, int pos, long id) { ... } }); builder.setView(list); 

    А затем сохраните ссылку на диалог

     mDialog = builder.show(); 

    С тем чтобы уволить его в случае необходимости

     mDialog.dismiss(); 

Как запретить отклонение диалога, когда пользователь нажимает на элемент

Как изменить фон элемента, который был выбран, когда пользователь нажимает на него

Вот пример

 public class MainActivity extends AppCompatActivity { private static final String listFragmentTag = "listFragmentTag"; private static final String data[] = {"one", "two", "three", "four"}; public MainActivity() { super(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void btnClick(View v) { ListFragment lf = new ListFragment(); lf.show(getSupportFragmentManager(), listFragmentTag); } public static class ListFragment extends DialogFragment { @Override @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder adb = new AlertDialog.Builder(getActivity()); adb.setIcon(android.R.drawable.ic_dialog_info) .setTitle("List") .setItems(data, null) .setPositiveButton("OK", null); // pass your onClickListener instead of null // to keep dialog open after click on item AlertDialog ad = adb.create(); ad.getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { private int colorOrg = 0x00000000; private int colorSelected = 0xFF00FF00; private View previousView; @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // restoring color of previous view if(previousView != null) { previousView.setBackgroundColor(colorOrg); } // changing items's BG color view.setBackgroundColor(colorSelected); previousView = view; } }); return ad; } @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); } } } 
  1. Вы можете использовать setCanceledOnTouchOutside (false) или setCanceleable (false).
  2. Установите селектор для тега корневого элемента диалогового макета xml.