Intereting Posts

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.