Android DialogFragment: как сохранить представление при многократном вызове show()?

У меня есть фрагмент диалога, использующий пользовательский макет с довольно сложной иерархией представлений. Код фрагмента диалога более-менее похож на следующий.

public class CardDetailDialog extends DialogFragment { 

    public CardDetailDialog() { 
        setRetainInstance(true);
        setStyle(STYLE_NORMAL, android.R.style.Theme_Light);
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.card_detail_dialog, container, false);
        /* Modify some view objects ... */
        return view;
    }
}

Всякий раз, когда я вызывал метод show() для этого фрагмента диалога, я замечал, что всегда вызывается onCreateView и процесс надувания макета повторяется. В моем приложении пользователь может захотеть показать диалог несколько раз во время сеанса, и я подумал, что это неэффективно. Есть ли способ сохранить экземпляр представления/диалога при нескольких вызовах show()? Можно ли это сделать с помощью DialogFragment или мне нужно иметь дело напрямую с классом Dialog?


person Andree    schedule 31.01.2013    source источник


Ответы (1)


Кажется, что использование логического флага помогает (см. КЛЮЧЕВЫЕ ИЗМЕНЕНИЯ). Я переопределяю onCreateDialog, но использование той же стратегии в onCreateView также должно работать (сохраняйте ссылку на созданное вами представление)

Я все еще получаю некоторые проблемы, связанные с изменениями ориентации, но это может быть связано с другая проблема

public class LogFragment extends DialogFragment{

private boolean isCreated;  //KEY CHANGE
private Dialog mDialog;     //KEY CHANGE -- to hold onto dialog instance across show()s

public LogFragment() {
    setRetainInstance(true); // This keeps the fields across activity lifecycle
    isCreated = false;       // KEY CHANGE - we create the dialog/view the 1st time
}

@Override
public Dialog onCreateDialog(Bundle inState) {
    if (isCreated) return mDialog;  // KEY CHANGE - don't recreate, just send it back
    View v = View.inflate(getActivity(),R.layout.log_layout,null);
    mDialog = new AlertDialog.Builder(getActivity())
            ...
            .create();
    isCreated = true;  // KEY CHANGE Set the FLAG
    return mDialog;
}
person CjS    schedule 28.09.2013