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();
}
Есть две проблемы, которые я пытаюсь решить.
Как предотвратить отклонение диалога, когда пользователь нажимает на элемент
Как изменить фон элемента, который был выбран, когда пользователь нажимает на него
Ответы
Ответ 1
Чтобы предотвратить отклонение диалога от щелчка на элементе, вы можете использовать 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 stuff here
}
});
Ответ 2
-
Вы можете настроить пользовательский 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();
Ответ 3
Как предотвратить отклонение диалога, когда пользователь нажимает на элемент
Как изменить фон элемента, который был выбран, когда пользователь нажимает на него
Вот пример
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 BG color
view.setBackgroundColor(colorSelected);
previousView = view;
}
});
return ad;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
}
}
}
Ответ 4
- Вы можете использовать setCanceledOnTouchOutside (false) или setCanceleable (false).
- Установите селектор для тега корневого элемента диалогового макета xml.