DialogFragment mostrando AlertDialog com Adaptador não sobrevive à mudança de orientação
Pergunta
Eu bati em uma parede com este. Meu DialogFragment funciona bem com todos os outros diálogos que possuo, exceto aquele que usa um adaptador do cliente. Ao mudar a orientação pela segunda vez, recebo um java.lang.IllegalStateException: Fragment NewAlertDialog{447bc528} not attached to Activity
. Isso está usando o pacote de suporte API 4+.
Isso não acontece na primeira mudança de orientação, sempre acontece na segunda, ou seja, acontece nesta ordem com a caixa de diálogo mostrando:
- Retrato -> Paisagem -> Retrato -> java.lang.IllegalStateException
- Paisagem -> Retrato -> Paisagem -> java.lang.IllegalStateException
Aqui está a caixa de 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 é um 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;
}
}
Sei que é um problema de conter um adaptador porque se eu remover a chamada .setAdapter()
de AlertDialog.Builder
, o problema desaparece.
Também estranho é que NÃO HÁ PROBLEMA no meu dispositivo ICS. Isso só acontece no dispositivo Gingerbread que eu testei. Qualquer ajuda é muito apreciada!
Obrigado!
Matt.
Solução
Problema resolvido.Chamar recursos getResources () fora da Activity em vez de DialogFragment foi a mudança necessária.
Antes:
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);
Depois:
int dp10 = (int) (10 * getActivity().getResources().getDisplayMetrics().density + 0.5f);