Как добавить флажок в диалоговое окно предупреждения
В настоящее время, когда пользователь открывает мое приложение, открывается AlertDialog
, спрашивая его, хотят ли они перейти на профессиональную версию.
Мне нужно добавить CheckBox
в AlertDialog
, чтобы приложение больше не показывало AlertDialog
когда пользователь открывает приложение.
Вот что у меня сейчас есть для AlertDialog
:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(" MY_TEXT");
builder.setMessage(" MY_TEXT ")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Uri uri = Uri.parse("market://details?id=MY_APP_PACKAGE");
Intent intent = new Intent (Intent.ACTION_VIEW, uri);
startActivity(intent); }
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
}).show();
Как добавить CheckBox
в AlertDialog
, чтобы приложение больше не отображало AlertDialog
когда пользователь открывает приложение?
Ответы
Ответ 1
Вы должны использовать метод setView(View)
AlertDialog.Builder
объекта AlertDialog.Builder
. Это поместит переданный в View
между областью сообщения и кнопками. Просто надуйте View
с помощью CheckBox
и передайте это. Вот пример:
checkbox.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<CheckBox
android:id="@+id/checkbox"
style="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp" />
</FrameLayout>
Код в вашей деятельности
View checkBoxView = View.inflate(this, R.layout.checkbox, null);
CheckBox checkBox = (CheckBox) checkBoxView.findViewById(R.id.checkbox);
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Save to shared preferences
}
});
checkBox.setText("Text to the right of the check box.");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(" MY_TEXT");
builder.setMessage(" MY_TEXT ")
.setView(checkBoxView)
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Uri uri = Uri.parse("market://details?id=MY_APP_PACKAGE");
Intent intent = new Intent (Intent.ACTION_VIEW, uri);
startActivity(intent); }
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
}).show();
Ответ 2
Вы можете использовать множественный список с одним элементом:
final boolean[] checked = new boolean[] {false};
builder.setMultiChoiceItems(new String[]{"Remember decision"}, checked, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
checked[i] = b;
}
});
Затем в OnClick()
кнопки диалога с предупреждением вы можете проверить значение флажка checked[0]
и сохранить это значение в приложении Sharedpreferences
:
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if(checked[0]){
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("preferences_never_buy_pro", true);
editor.apply();
}
dialog.cancel();
}
});
С этим предпочтением вы можете решить, будет ли диалоговое окно отображаться снова в будущем.
Ответ 3
Сначала вам нужно определить макет, содержащий сообщение и флажок для отключения предупреждения для последующих просмотров. Затем вместо вызова builder.setMessage
вы вызываете:
builder.setView(myAlertViewWithDisablingCheckbox);
Затем, когда пользователь нажимает кнопку "Предупреждение", вам нужно будет проверить, установлен ли этот флажок, и сохранить это предпочтение в приложении SharedPreferences
. Затем вы можете использовать это предпочтение, чтобы определить, должно ли это диалоговое окно предупреждения снова отображаться пользователю.
Ответ 4
![Enter image description here]()
Способ создания списка setMultiChoiceItems
заключается в использовании setMultiChoiceItems
в AlertDialog
.
// Set up the alert builder
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose some animals");
// Add a checkbox list
String[] animals = {"horse", "cow", "camel", "sheep", "goat"};
boolean[] checkedItems = {true, false, false, true, false};
builder.setMultiChoiceItems(animals, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// The user checked or unchecked a box
}
});
// Add OK and Cancel buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// The user clicked OK
}
});
builder.setNegativeButton("Cancel", null);
// Create and show the alert dialog
AlertDialog dialog = builder.create();
dialog.show();
Здесь я жестко запрограммировал, какие пункты в списке уже были проверены. Скорее всего, вы захотите отслеживать их в ArrayList<Integer>
. Смотрите пример документации для более подробной информации. Вы также можете установить отмеченные элементы на null
если вы хотите, чтобы все начиналось без проверки.
Для context
, вы можете использовать this
если вы находитесь в деятельности.
Мой более полный ответ здесь.
Котлин версия
// Set up the alert builder
val builder = AlertDialog.Builder(context)
builder.setTitle("Choose some animals")
// Add a checkbox list
val animals = arrayOf("horse", "cow", "camel", "sheep", "goat")
val checkedItems = booleanArrayOf(true, false, false, true, false)
builder.setMultiChoiceItems(animals, checkedItems) { dialog, which, isChecked ->
// The user checked or unchecked a box
}
// Add OK and Cancel buttons
builder.setPositiveButton("OK") { dialog, which ->
// The user clicked OK
}
builder.setNegativeButton("Cancel", null)
// Create and show the alert dialog
val dialog = builder.create()
dialog.show()