J'utilise Dialog dans mon application pour permettre à l'utilisateur de faire plusieurs choix. Voici mon code:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Build an AlertDialog
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
// String array for alert dialog multi choice items
String[] colors = new String[]{
"Red",
"Green",
"Blue",
"Purple",
"Olive"
};
// Boolean array for initial selected items
final boolean[] checkedColors = new boolean[]{
false, // Red
false, // Green
false, // Blue
false, // Purple
false // Olive
};
// Convert the color array to list
final List<String> colorsList = Arrays.asList(colors);
// Set multiple choice items for alert dialog
builder.setMultiChoiceItems(colors, checkedColors, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// Update the current focused item's checked status
checkedColors[which] = isChecked;
// Get the current focused item
String currentItem = colorsList.get(which);
// Notify the current action
Toast.makeText(getApplicationContext(),
currentItem + " " + isChecked, Toast.LENGTH_SHORT).show();
}
});
// Specify the dialog is not cancelable
builder.setCancelable(false);
// Set a title for alert dialog
builder.setTitle("Your preferred colors?");
// Set the positive/yes button click listener
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do something when click positive button
tv.setText("Your preferred colors..... \n");
for (int i = 0; i<checkedColors.length; i++){
boolean checked = checkedColors[i];
if (checked) {
tv.setText(tv.getText() + colorsList.get(i) + ", ");
}
}
}
});
// Set the negative/no button click listener
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do something when click the negative button
}
});
// Set the neutral/cancel button click listener
builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do something when click the neutral button
}
});
AlertDialog dialog = builder.create();
// Display the alert dialog on interface
dialog.show();
}
});
Et j'ai deux questions:
Comme j'ai choisi le rouge et le violet
(puis dans TextView obtenant une sortie comme ceci: Red, Purple,
)
Tout d'abord je voudrais supprimer la virgule (qui a la dernière valeur)
J'ai déjà sélectionné Rouge et Violet, quand j'ouvre à nouveau la boîte de dialogue ne devenant pas rouge et violet comme sélectionné par défaut (Comment puis-je enregistrer l'état) enter code here
, et en conséquence, lorsque je sélectionne à nouveau ces deux éléments (Rouge et Violet), obtenir chaque élément deux fois dans un TextView
Essayez de mettre à jour votre textview après la boucle
Et si votre itération de boucle atteint la longueur de la variable checkedcolors
, n’ajoutez pas de virgule.
public void onClick(DialogInterface dialog, int which) {
// Do something when click positive button
tv.setText("Your preferred colors..... \n");
for (int i = 0; i < checkedColors.length; i++) {
boolean checked = checkedColors[i];
String colors = "";
if (checked) {
colors = colors + colorsList.get(i) ;
if (i != checkedColors.length - 1) {
colors = colors + ", ";
}
}
}
tv.setText(tv.getText() + colors);
}
Votre texte ne sera mis à jour qu'une seule fois, vous ne recevrez donc pas chaque élément deux fois dans TextView.
Pour sauvegarder l’état, vous devez utiliser SharedPreference
.
Pour enregistrer de préférence, utilisez cette
SharedPreferences preferences = mContext.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("yourColor",isChecked);
editor.commit();
Et pour récupérer
boolean isChecked = preferences.getBoolean("yourColor");
Essayez ceci et améliorez la structure de votre code afin qu'il puisse être géré efficacement.
import Android.app.AlertDialog;
import Android.content.DialogInterface;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TextView;
import Android.widget.Toast;
import Java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView txtSelected;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn_dialog);
txtSelected = (TextView) findViewById(R.id.txt_selected);
final ArrayList<ColorVO> colorList = new ArrayList<ColorVO>();
// String array for alert dialog multi choice items
final String[] colors = new String[]{
"Red",
"Green",
"Blue",
"Purple",
"Olive"
};
// Boolean array for initial selected items
final boolean[] checkedColors = new boolean[]{
false, // Red
false, // Green
false, // Blue
false, // Purple
false // Olive
};
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
// make a list to hold state of every color
for (int i = 0; i < colors.length; i++) {
ColorVO colorVO = new ColorVO();
colorVO.setName(colors[i]);
colorVO.setSelected(checkedColors[i]);
colorList.add(colorVO);
}
// Do something here to pass only arraylist on this both arrays ('colors' & 'checkedColors')
builder.setMultiChoiceItems(colors, checkedColors, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// set state to vo in list
colorList.get(which).setSelected(isChecked);
Toast.makeText(getApplicationContext(),
colorList.get(which).getName() + " " + isChecked, Toast.LENGTH_SHORT).show();
}
});
builder.setCancelable(false);
builder.setTitle("Your preferred colors?");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
txtSelected.setText("Your preferred colors..... \n");
// save state of selected vos
ArrayList<ColorVO> selectedList = new ArrayList<>();
for (int i = 0; i < colorList.size(); i++) {
ColorVO colorVO = colorList.get(i);
colors[i] = colorVO.getName();
checkedColors[i] = colorVO.isSelected();
if (colorVO.isSelected()) {
selectedList.add(colorVO);
}
}
for (int i = 0; i < selectedList.size(); i++) {
// if element is last then not attach comma or attach it
if (i != selectedList.size() - 1)
txtSelected.setText(txtSelected.getText() + selectedList.get(i).getName() + " ,");
else
txtSelected.setText(txtSelected.getText() + selectedList.get(i).getName());
}
colorList.clear();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// make sure to clear list that duplication dont formed here
colorList.clear();
}
});
builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// make sure to clear list that duplication dont formed here
colorList.clear();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
}
private class ColorVO {
private String name;
private boolean selected;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}
Résolu toutes vos questions:
=> Vérifier l’index de l’élément. Si c’est le dernier, ne pas joindre de virgule.
=> save state en utilisant vo dans votre tableau par défaut. Il sera sauvegardé jusqu'à ce que votre activité ne soit pas détruite.
=> Effacer la liste afin que les valeurs ne soient pas dupliquées.