DialogFragment que muestra AlertDialog con adaptador no sobrevive al cambio de orientación
Pregunta
Me he topado con una pared con este.Mi DialogFragment funciona bien con todos los demás cuadros de diálogo que tengo excepto el que usa un Adaptador de cliente.Al cambiar de orientación la segunda vez obtengo un java.lang.IllegalStateException: Fragment NewAlertDialog{447bc528} not attached to Activity
Esto utiliza el paquete de soporte API 4+.
No sucede en el primer cambio de orientación, siempre sucede en el segundo, lo que significa que sucede en este orden y el cuadro de diálogo muestra:
- Retrato -> Paisaje -> Retrato -> java.lang.IllegalStateException
- Paisaje -> Retrato -> Paisaje -> java.lang.IllegalStateException
Aquí está el diálogo:
@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();
}
Este es un elemento de diálogo:
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;
}
}
Sé que es un problema contener un adaptador porque si elimino el .setAdapter()
Llamada de AlertDialog.Builder
entonces el problema desaparece.
También es extraño que NO HAY PROBLEMA en mi dispositivo ICS.Esto sólo sucede en el dispositivo Gingerbread que pruebo.¡Cualquier ayuda es muy apreciada!
¡Gracias!
Mate.
Solución
Problema resuelto.Llamar a los recursos getResources() fuera de la Actividad en lugar de DialogFragment fue el cambio necesario.
Antes:
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);
Después:
int dp10 = (int) (10 * getActivity().getResources().getDisplayMetrics().density + 0.5f);