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

Android 如何通过配置更改保留对象引用?,android,dialog,Android,Dialog,我已经创建了可重用的文本查询对话框片段。但它不处理配置。变化。片段创建后,mClickListener为null(如预期的那样)。问题是-如何保留回调? (我是java新手,可能不知道常见的java模式/解决方案) 用法: TextQueryDialogFragment dialog = new TextQueryDialogFragment(); dialog.setQueryText(mBookmarkTitle); dialog.setClickListener(new OnDialogL

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

用法:

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()));