Android 如何通过配置更改保留对象引用?
我已经创建了可重用的文本查询对话框片段。但它不处理配置。变化。片段创建后,mClickListener为null(如预期的那样)。问题是-如何保留回调? (我是java新手,可能不知道常见的java模式/解决方案) 用法:Android 如何通过配置更改保留对象引用?,android,dialog,Android,Dialog,我已经创建了可重用的文本查询对话框片段。但它不处理配置。变化。片段创建后,mClickListener为null(如预期的那样)。问题是-如何保留回调? (我是java新手,可能不知道常见的java模式/解决方案) 用法: TextQueryDialogFragment dialog = new TextQueryDialogFragment(); dialog.setQueryText(mBookmarkTitle); dialog.setClickListener(new OnDialogL
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/标记检索它们
- 在创建父片段时更新中的回调: TextQueryDialogFragment对话框=(TextQueryDialogFragment) getFragmentManager().findFragmentByTag(重命名_标记); 如果(空!=对话框){ setClickListener(getListener()); }
是否有更好的解决方案,或者这两种解决方案都可以?我想您正在寻找
onRetainConfigurationInstance
,您可以返回任何想要的对象
public Object onRetainNonConfigurationInstance() { ... }
然后,您可以在onCreate()
中获得它:
但是,我不确定为什么需要保留
OnClickListener
解决方案很简单,与onRetainConfigurationInstance
或此处提到的其他技术无关。重新创建父片段时,只需在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() {}
}
);
}
在这种情况下,我宁愿通过片段类实现onClickListener,这样您就可以这样重写它:
TextQueryDialogFragment retFragment =
(TextQueryDialogFragment )getFragmentManager().findFragmentByTag("MYTAG");
if(retFragment != null)
{
retFragment.setClickListener(this);
}
我也遇到过类似的问题,维塔科特的回答就是解决办法!但我的情况稍微复杂一点:我有一个片段“MyAttributeFragment”,它使用DialogFragment进行文本输入。此MyAttributeFragment在同一活动中被多次使用,因此DialogFragment的静态标记(如“MYTAG”)不是唯一的。我通过获取MyAttributeFragment的ID来识别所拥有的片段,从而解决了这个问题
//Create DialogFragment with the unique ID of the owning fragment
newFragment.show(getFragmentManager(), String.valueOf(this.getId()));
好吧,如果我不保留OnClickListener,我将不得不以某种方式恢复它,因为它变为null。你说我不应该留电话。如上所述,我是Java新手,我的方法可能不正确。你能告诉我什么样的实现才是正确的吗?
TextQueryDialogFragment retFragment =
(TextQueryDialogFragment )getFragmentManager().findFragmentByTag("MYTAG");
if(retFragment != null)
{
retFragment.setClickListener(this);
}
//Create DialogFragment with the unique ID of the owning fragment
newFragment.show(getFragmentManager(), String.valueOf(this.getId()));