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.

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top