我已经创建了可重用的文本查询对话框片段。但是它不处理配置。变化。片段重新创建后,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);
}