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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top