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.