Intereting Posts

ViewPager в DialogFragment – IllegalStateException: Фрагмент не имеет вида

Что я хочу достичь

  • Из FragmentActivity увидите диалог при нажатии кнопки действий на панели действий
  • DialogFragment – Диалог без заголовка
  • TabHost – вкладки в верхней части диалогового окна
  • ViewPager с FragmentPagerAdapter – Swipable, содержимое которого связано с вкладками
  • 2-3 диалоговые кнопки (разные подклассы диалога, разные кнопки) – не предполагается, что они находятся в одном из ViewPager , что означает, что одни и те же кнопки должны оставаться в нижней части диалогового ViewPager независимо от того, какой Fragment ViewPager в ViewPager ,

Проблема

 IllegalStateException: Fragment does not have a view 

То, что я пробовал / сделал до сих пор

  • Использование пакета android.support.v4 для необходимых классов
  • Вызов getChildFragmentManager() вместо getSupportedFragmentManager()
  • Реализовано, что сообщение № 10 предлагается по этой ссылке https://code.google.com/p/android/issues/detail?id=42601 . Я ViewPager код непосредственно в два класса Fragment , которые, как предполагается, должен показывать DialogFragment , плюс класс DialogFragment .
  • В моем пользовательском DialogFragment я сначала попытался переопределить onCreateView , затем onCreateDialog а затем и то и другое одновременно. Все, что я получил, но с неожиданными результатами.
    • Только onCreateView : не AlertDialog.Builder достичь AlertDialog.Builder чтобы создать нужные кнопки, кроме того, что результаты Dialog были отличными.
    • Только onCreateDialog : сообщение об ошибке, показанное выше. Я по-прежнему представляю, как этот метод приближается к тому, что я хочу достичь.
    • Как onCreateView и onCreateDialog : onCreateDialog макет диалога в onCreateView и добавил кнопки Dialog в AlertDialog.Builder в onCreateDialog . Это отобразило диалог, но добавленные кнопки из AlertDialog.Builder не были AlertDialog.Builder . Кроме того, клавиатура не отображалась при нажатии на поле EditText .

Исходный код

Большинство из них взяты из учебника, чтобы реализовать использование TabHost в Android 2.2 + ViewPager и 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).

Solutions Collecting From Web of "ViewPager в DialogFragment – IllegalStateException: Фрагмент не имеет вида"

Я думаю, что я просто столкнулся с этой проблемой и узнал несколько вещей, посмотрев на источник для DialogFragment .

Похоже, что переопределение onCreateDialog (…) является допустимым способом создания настраиваемого диалогового окна, это приведет к тому, что DialogFragment будет иметь нулевой вид, как указано в сообщении об ошибке. В большинстве случаев это хорошо – DialogFragment не нуждается в представлении, чтобы показывать диалог, но если вы хотите еще больше разложить фрагменты (как и вы), это не будет летать.

Учитывая, что вы хотите взаимодействовать с AlertDialog.Builder, действительно нет идеального решения, которое я могу видеть, но у вас есть несколько вариантов:

  1. Создайте кнопки в диалоговом окне как часть представления (не используя AlertDialog.Builder). Вы делаете это, переопределяя onCreateView вместо onCreateDialog. Вы должны иметь возможность получить функциональность, которую вы упомянули, поместив кнопки в свой собственный фрагмент. Мы делаем что-то подобное на моем концерте, и я очень предпочитаю этот метод.
  2. Внедрите свой собственный тип, который наследует от Fragment и который зеркально отображает DialogFragment, за исключением того, что вам нужно. Это не должно быть слишком страшно, поскольку DialogFragment составляет только ~ 400 и сильно комментируется. Может быть весело.
  3. Используйте обычный PagerAdapter вместо FragmentPagerAdapter. Таким образом, не будет иметь значения, что ваш DialogFragment не имеет представления.

Использовать

 onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 

Вместо onCreateDialog (Bundle savedInstanceState). Не создавайте диалоговое окно оповещений, используйте надуватель, предоставляемый методом, и создавайте свое представление. Меня устраивает.

С наилучшими пожеланиями!

Или используйте PagerAdapter вместо FragmentStatePagerAdapter

Разъясняется здесь: https://stackoverflow.com/a/21418952/771098

Благодаря @Tommy Visic для написания действительно хорошего описания это сработало.

Проводка кода, который работал для меня.

Я удалил код построения Dialog из метода onCreateDialog который был удален методом onCreateDialog и диалоговое представление, которое я использовал в пользовательском представлении Dialog's Я включил его как представление в метод onCreateView и все, что начало работать.

 @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.login_sigup_screen, null, false); bind = ButterKnife.bind(this, view); initViewPager(); return view; } 

Столкнувшись с еще одной проблемой с этой реализацией:

Когда у Activity есть Toolbar/ActionBar она также отображается в DialogFragment окне DialogFragment чтобы избежать того, что должно быть сделано: onViewCreated метод onViewCreated Fragment и добавить код ниже

 Dialog dialog = getDialog(); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); float dimAmount = 0.6f; dialog.getWindow().setDimAmount(dimAmount); 

Это приведет к удалению Toolbar из DialogFragment « DialogFragment и « Activity .

ура

Благодаря @Tommy

С уважением Зевс