1

我有一个 Fragment 覆盖该public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)方法而无需像这样调用 super :

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.my_id, container, false);
        return view;
    }

此片段用于活动和自定义DialogPreference实现中。该片段包含在活动的布局文件和带有<fragment>标签的首选项中,并且android:id在两者中都有一个属性(尽管活动布局和首选项布局的 id 不同)。

自定义 DialogPreference 在 PreferenceFragment 中使用,一切都按预期工作。当我单击 PreferenceScreen 中的自定义 Preference 时,将调用 onCreateView 方法,并且正确显示包含我的 Fragment 的 DialogFragment。当我按回时,对话框关闭并再次显示 PreferenceScreen。在下一次单击时,再次调用 onCreateView 并且一切正常。

现在我正在尝试向这个 Fragment 添加一个“RetainedFragment”来存储一些状态,如此所述。为了实现这一点,我在我的片段中覆盖了 onCreate,如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FragmentManager fm = getFragmentManager();
    retainedFragment = (RetainedFragment) fm.findFragmentByTag("retained");
    if(retainedFragment == null) {
        retainedFragment = new RetainedFragment();
        fm.beginTransaction().add(retainedFragment, "retained").commit();
    }
}

这非常适合 Activity 案例,但是现在,当我尝试连续两次打开 DialogPreference 时,应用程序崩溃

java.lang.IllegalStateException: 
Fragment com.myapp.MyFragment did not create a view

我设置了一些断点,问题似乎是onCreateView我的片段的方法只有在打开PreferenceScreen后第一次点击我的DialogPreference时才被调用。当我在两者之间关闭 PreferenceScreen 时,它也可以正常工作。

值得注意的是,异常发生在初始 Fragment,而不是新的“RetainedFragment”。

4

0 回答 0