Android DialogFragment:如何在多次show()调用中保留视图?

4

我有一个使用自定义布局和相当复杂的视图层次结构的对话框片段。对话框片段的代码大致类似于以下内容。

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类?
1个回答

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接