【发布时间】:2013-11-30 18:15:08
【问题描述】:
我想要达到的目标
- 来自
FragmentActivity在单击操作栏中的操作按钮时显示对话框 -
DialogFragment- 没有标题的对话框 -
TabHost- 对话框顶部的选项卡 -
ViewPager和FragmentPagerAdapter- 可滑动,哪些内容连接到选项卡 - 2-3 对话框按钮(对话框的不同子类,不同的按钮) - 不应该在
ViewPager的Fragment之一中,这意味着相同的按钮应该保留在对话框的底部,无论如何FragmentViewPager显示的内容。
问题
IllegalStateException: Fragment does not have a view
到目前为止我已经尝试/做了什么
- 将
android.support.v4包用于必要的类 - 调用
getChildFragmentManager()而不是getSupportedFragmentManager() - 实施了此链接 https://code.google.com/p/android/issues/detail?id=42601 建议的帖子 #10。我将代码直接复制/粘贴到我的两个
Fragment类中,ViewPager应该显示,加上DialogFragment类。 - 在我的自定义
DialogFragment中,我首先尝试覆盖onCreateView,然后是onCreateDialog,然后同时覆盖两者。我必须运行所有这些,但结果出乎意料。- 仅
onCreateView:无法访问AlertDialog.Builder来创建所需的按钮,除了对话框的结果很棒。 - 仅
onCreateDialog:上面显示的错误消息。我仍然认为这种方法与我想要达到的目标一样接近。 -
onCreateView和onCreateDialog:在onCreateView中扩充对话框布局,并将对话框按钮添加到onCreateDialog中的AlertDialog.Builder。这显示了对话框,但AlertDialog.Builder中添加的按钮不可见。另外,当点击EditText字段时,键盘没有出现。
- 仅
源代码
大部分来自 Tutorial to implement the use of TabHost in Android 2.2 + ViewPager and Fragments。 ActivityFragment 的代码在 DialogFragment 中。但是,我将其 ViewPager 替换为来自此答案 https://stackoverflow.com/a/18167273/2375978 的源代码中的修改版本。这是为了能够在高度上wrap_content。
我的项目中的错误代码在DialogFragment的onCreateDialog方法中,我相信。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), AlertDialog.THEME_HOLO_DARK);
LayoutInflater inflater = getActivity().getLayoutInflater();
view = inflater.inflate(R.layout.dialog_test, null);
addActionButtons(builder, view);
builder.setView(view);
mViewPager = (WrapContentHeightViewPager) view.findViewById(R.id.viewpager);
initialiseTabHost();
List<Fragment> fragments = getFragments();
pageAdapter = new DialogPageAdapter(getChildFragmentManager(), fragments);
mViewPager.setAdapter(pageAdapter);
mViewPager.setOnPageChangeListener(this);
Dialog dialog = builder.create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
dialog.show();
return dialog;
}
堆栈跟踪 LogCat 日志
FATAL EXCEPTION: main
java.lang.IllegalStateException: Fragment does not have a view
at android.support.v4.app.Fragment$1.findViewById(Fragment.java:1425)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:901)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1374)
at my.app.package.name.WrapContentHeightViewPager.onMeasure(WrapContentHeightViewPager.java:31)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15481)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:617)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:15481)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2377)
at android.view.View.measure(View.java:15481)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1982)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1200)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1398)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1118)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4525)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4946)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.jav
还有……
- 我未能成功尝试 https://code.google.com/p/android/issues/detail?id=42601 中提到的其他可能的解决方案,在帖子 #2 和 #13 中提到,因为我不明白如何以及在哪里可以在我的代码中使用它(我想我'我和写#18的人在同一条船上)。
【问题讨论】:
-
如果你成功了,请分享你的代码
标签: android android-fragments android-viewpager android-dialogfragment