DialogFragment montrant alertdialog avec adaptateur ne survivra pas le changement d'orientation
Question
J'ai heurté un mur sur celui-ci. Mon fragment de dialogue fonctionne bien avec toutes les autres boîtes de dialogue que j'ai, à l'exception de celle qui utilise un adaptateur client. Lorsque je change d'orientation la deuxième fois que j'obtiens un java.lang.IllegalStateException: Fragment NewAlertDialog{447bc528} not attached to Activity
Il s'agit du package de support API 4+.
Cela ne se produit pas lors du premier changement d'orientation, cela se produit toujours sur le second, ce qui signifie que cela se produit dans cet ordre avec la boîte de dialogue indiquant:
- Portrait -> Paysage -> Portrait -> Java.lang.ILLEGALSTATEException
- Paysage -> Portrait -> Paysage -> Java.lang.ILLEGALSTATEException
Voici la boîte de dialogue:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final DialogItem[] items = {
new DialogItem(getString(R.string.test1), R.drawable.test1),
new DialogItem(getString(R.string.test2), R.drawable.test2),
};
ListAdapter adapter = new ArrayAdapter<DialogItem>(getActivity(),
android.R.layout.select_dialog_item,
android.R.id.text1,
items){
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
TextView tv = (TextView)v.findViewById(android.R.id.text1);
tv.setCompoundDrawablesWithIntrinsicBounds(items[position].icon, 0, 0, 0);
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);
tv.setCompoundDrawablePadding(dp10);
return v;
}
};
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.title)
.setIcon(R.drawable.icon)
.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0)
doThis();
else
doThat();
}
}).create();
}
Ceci est un dialogine:
class DialogItem {
public final String text;
public final int icon;
public DialogItem(String text, Integer icon) {
this.text = text;
this.icon = icon;
}
@Override
public String toString() {
return text;
}
}
Je sais que c'est un problème avec la contenu d'un adaptateur parce que si je supprime le .setAdapter()
appeler de AlertDialog.Builder
Ensuite, le problème disparaît.
Il n'y a pas non plus de problème sur mon appareil ICS. Cela ne se produit que sur l'appareil en pain d'épice sur lequel je teste. Toute aide est grandement appréciée!
Merci!
Mat.
La solution
Problème résolu. Appeler GetResources () Ressources de l'activité au lieu du dialogue de dialogue était le changement nécessaire.
Avant de:
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);
Après:
int dp10 = (int) (10 * getActivity().getResources().getDisplayMetrics().density + 0.5f);