DialogFragment che mostra AlertDialog with Adapter non sopravvive alla modifica dell'orientamento
Domanda
Ho sbattuto contro un muro su questo. Il mio DialogFragment funziona bene con tutte le altre finestre di dialogo che ho ad eccezione di quella che utilizza un adattatore del cliente. Quando cambio l'orientamento la seconda volta ricevo un java.lang.IllegalStateException: Fragment NewAlertDialog{447bc528} not attached to Activity
Questo sta usando il pacchetto di supporto API 4+.
Non avviene al primo cambio di orientamento, avviene sempre al secondo, il che significa che avviene in questo ordine con la finestra di dialogo che mostra:
- Ritratto -> Paesaggio -> Ritratto -> java.lang.IllegalStateException
- Landscape -> Portrait -> Landscape -> java.lang.IllegalStateException
Ecco la finestra di dialogo:
@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();
}
Questo è un DialogItem:
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;
}
}
So che è un problema con il contenimento di un adattatore perché se rimuovo la chiamata .setAdapter()
da AlertDialog.Builder
, il problema scompare.
È anche strano che non ci siano PROBLEMI sul mio dispositivo ICS. Questo accade solo sul dispositivo Gingerbread su cui provo. Qualsiasi aiuto è molto apprezzato!
Grazie!
Matt.
Soluzione
Problema risolto.Chiamare le risorse getResources () dall'attività invece che dal DialogFragment è stata la modifica necessaria.
Prima:
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);
Dopo:
int dp10 = (int) (10 * getActivity().getResources().getDisplayMetrics().density + 0.5f);