【问题标题】:ViewPager in DialogFragment, IllegalStateException: Fragment does not have a viewDialogFragment 中的 ViewPager,IllegalStateException:Fragment 没有视图
【发布时间】:2013-04-05 16:12:06
【问题描述】:

EDIT3:似乎只有 API17 及以上版本才能让 ViewPager 与 ChildFragmentManager 一起正常工作......

我正在尝试将ViewPager 添加到我的 DialogFragment:

public class FirstLaunchDialogFragment extends DialogFragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_Sherlock_Light_Dialog);
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final View v = getActivity().getLayoutInflater().inflate(
            R.layout.fragment_dialog_first_launch, null);
    ViewPager viewPager = (ViewPager) v.findViewById(R.id.pager);

    viewPager.setAdapter(new FirstLaunchFragmentsAdapter(getChildFragmentManager()));

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setView(v).setInverseBackgroundForced(true);
    return builder.create();
}
}

由于某些原因,它会崩溃说:

04-06 00:00:49.600: E/AndroidRuntime(3734): java.lang.IllegalStateException: Fragment does not have a view
04-06 00:00:49.600: E/AndroidRuntime(3734):     at android.support.v4.app.Fragment$1.findViewById(Fragment.java:1425)
04-06 00:00:49.600: E/AndroidRuntime(3734):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
04-06 00:00:49.600: E/AndroidRuntime(3734):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
04-06 00:00:49.600: E/AndroidRuntime(3734):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
04-06 00:00:49.600: E/AndroidRuntime(3734):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
04-06 00:00:49.600: E/AndroidRuntime(3734):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
.....

我已经在谷歌上搜索了半天的 Fragment does not have a view 异常,但没有结果

在我看来,适配器无法膨胀布局或其他东西......

这是我的片段和适配器

public static class UserWelcomeFragment extends Fragment {

    public static UserWelcomeFragment newInstance() {
        return new UserWelcomeFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_welcome_user, container, false);

        return v;
    }

}

private class FirstLaunchFragmentsAdapter extends FragmentPagerAdapter {

    public FirstLaunchFragmentsAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int arg0) {
        switch (arg0) {
        case 0:
            return UserWelcomeFragment.newInstance();

        case 1:
            return new IntegrationSelectingDialogFragment();

        default:
            return UserWelcomeFragment.newInstance();
        }

    }

    @Override
    public int getCount() {
        return 2;
    }

}

编辑:https://code.google.com/p/android/issues/detail?id=42601 看起来相关

EDIT2:我正在 API 16 上进行测试,该项目正在使用支持库 v4 修订版 12

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    您在哪个 Android 版本上进行测试? ViewPager 使用片段,并且因为您的 ViewPager 位于片段本身中,所以您正在嵌套片段。仅 API 17 (Jellybean) 支持嵌套片段,因此此实现仅适用于 Android 4.1+ 的设备。

    【讨论】:

    • 我使用的是 API 16,但我也在使用支持库 v4,支持库不应该让我的实现与较低的 API 版本兼容吗?
    【解决方案2】:

    我在轮换后忽略调用setContentView() 时收到此错误。我想我可能还试图在onResume() 中设置片段——这导致了非法状态(试图将片段添加到不存在的视图中)。

    所以对我来说,删除的解决方案

    android:configChanges="keyboardHidden|orientation"
    

    从我的清单中,并检查onResume 中的savedInstanceState / Bundle(所以我可以确保让系统重新创建我的片段,而不是自己添加它们。

    虽然由于这个错误有点神秘,但可能有比我这里的问题/解决方案更多的原因

    编辑:一些简单/有用代码的链接:

    retain the fragment object while rotating

    【讨论】:

      【解决方案3】:

      确保你在片段的 onCreateView() 方法中返回 rootView。

      @Nullable
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      
          rootView = inflater.inflate(R.layout.fragment_layout, container, false);
      
          getChildFragmentManager().beginTransaction().add(R.id.fragment_container, MyFragment.getInstance() ).commit();
      
          return rootView;
      }
      

      否则,android 会在 Activity 的 XML 中搜索片段容器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多