gpt4 book ai didi

android - 如何通过配置更改保留对象引用?

转载 作者:行者123 更新时间:2023-11-29 22:17:14 25 4
gpt4 key购买 nike

我创建了可重复使用的文本查询对话框 fragment 。但它不处理配置。变化。 fragment 重建后 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");

Serializable 将不起作用,因此 onSaveInstanceState 不是我需要的。 Parcelable 可能会(使用 aidl 和 IBinder)但是对于这样一个简单的任务来说太过分了。

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

  • 在应用程序中存储回调并通过 id/tag 检索它们 taken from here
  • 在创建父 fragment 时更新回调:

    TextQueryDialogFragment 对话框 = (TextQueryDialogFragment) getFragmentManager().findFragmentByTag(RENAME_TAG);如果(空!=对话框){dialog.setClickListener(getListener());

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

最佳答案

解决方案很简单,与onRetainConfigurationInstance 或此处提到的其他技术无关。重新创建父 fragment 时,只需在 FragmentManager 中搜索 TextQueryDialogFragment 实例,如果实例仍然存在,则再次设置监听器。

在父类的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() {}
}
);
}

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

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

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

关于android - 如何通过配置更改保留对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8175368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com