TextQueryDialogFragment

TextQueryDialogFragment

我已经创建了可重用的文本查询对话框片段。但是它不处理配置。变化。片段重新创建后,mClickListener为空(如预期)。问题是-如何保留回调?
(我是Java新手,可能不知道常见的Java模式/解决方案)

public class TextQueryDialogFragment extends DialogFragment {
private OnDialogListener mClickListener;
private EditText mTextWidget;

public void setClickListener(OnDialogListener listener) {
    mClickListener = listener;
}

public String getQueryText() {
    return mTextWidget.getText().toString();
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater factory = LayoutInflater.from(getActivity());
    final View queryView = factory.inflate(R.layout.query_dialog_text, null);
    mTextWidget = (EditText) queryView.findViewById(R.id.query_dialog_text);

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
    .setView(queryView)
    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            if(null != mClickListener)
                mClickListener.OnPositiveClick();
            dialog.dismiss();
        }
    })
    .setNegativeButton(android.R.string.cancel,
                                           new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            if(null != mClickListener)
                mClickListener.OnNegativeClick();
            dialog.cancel();
        }
    });

    return builder.create();
}
}


用法:

TextQueryDialogFragment dialog = new TextQueryDialogFragment();
dialog.setQueryText(mBookmarkTitle);
dialog.setClickListener(new OnDialogListener() {
        @Override
        public void OnPositiveClick() {
            String title = dialog.getQueryText();
            //do work here
        }

        @Override
        public void OnNegativeClick() {}
    });
dialog.show(getFragmentManager(), "MYTAG");


可序列化将无法工作,因此onSaveInstanceState不是我所需要的。使用Parcelable可以做到(使用aidl和IBinder),但是对于这样一个简单的任务而言,它太多了。

到目前为止,我发现了两种或多或少的合适解决方案:


将回调存储在Application中,并按ID /标记taken from here检索它们
在父片段创建时更新回调:

TextQueryDialogFragment对话框=(TextQueryDialogFragment)
             getFragmentManager()。findFragmentByTag(RENAME_TAG);
if(null!=对话框){
dialog.setClickListener(getListener());
}


有没有更好的解决方案,或者这两个都可以吗?

最佳答案

该解决方案很简单,与onRetainConfigurationInstance或此处提到的其他技术无关。重新创建父片段时,只需在TextQueryDialogFragment中搜索FragmentManager实例,然后在实例仍存在的情况下再次设置您的侦听器。

将以下代码添加到父级的onCreateView方法中:

TextQueryDialogFragment retFragment =
(TextQueryDialogFragment)getFragmentManager().findFragmentByTag("MYTAG");

if(retFragment != null)
{
    retFragment.setClickListener(new OnDialogListener() {
        @Override
        public void OnPositiveClick() {
            String title = dialog.getQueryText();
            //do work here
        }

        @Override
        public void OnNegativeClick() {}
    }
);
}


在这种情况下,我宁愿通过您的片段类实现onClickListener,以便您可以通过以下方式重写它:

TextQueryDialogFragment retFragment =
(TextQueryDialogFragment )getFragmentManager().findFragmentByTag("MYTAG");

if(retFragment != null)
{
    retFragment.setClickListener(this);
}

10-07 15:22