EDIT3:似乎只有API17及以上才能让ViewPager与ChildFragmentManager一起正常工作.........
我正在尝试向我的DialogFragment添加ViewPager
:
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
答案 0 :(得分:1)
您正在测试哪个Android版本? ViewPagers使用片段,并且因为ViewPager本身就是一个片段,所以您正在嵌套片段。嵌套片段仅支持API 17(Jellybean),因此此实现仅适用于安装了Android 4.1 +的设备。
答案 1 :(得分:1)
当我在轮换后忽略呼叫setContentView()
时,我收到此错误。我想我可能也试图在onResume()
中设置片段 - 这导致了非法状态(一个片段试图被添加到一个不存在的视图中)。
对我来说,解决方案是删除
android:configChanges="keyboardHidden|orientation"
从我的清单中,检查savedInstanceState
中的Bundle
/ onResume
(所以我可以确保让系统重新创建我的片段,而不是自己添加。< / p>
虽然由于这个错误有点神秘,但可能有比我的问题/解决方案更多的原因
编辑:指向一些简单/有用的代码的链接:
答案 2 :(得分:1)
确保你在片段的onCreateView()方法中返回rootView。
linspace
否则,android将在活动的XML中搜索片段容器。