Фрагмент, увеличенный в диалоговом окне «Фрагмент», выдает ошибку «Фрагмент не создал представление»

Пользователь нажимает кнопку, которая вызывает диалоговое окно фрагмента, которое расширяет фрагмент следующим образом:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        View view = getActivity().getLayoutInflater().inflate(
                R.layout.monday_fragment, null);
        builder.setView(view).setTitle("Homework Due Monday")
                .setNegativeButton("Dismiss", null);

        AlertDialog dialog = builder.create();
        dialog.show();

Вот xml указанного макета (monday_fragment.xml), где лежит ссылка на фрагмент, который нужно раздуть:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    >

    <fragment
        android:id="@+id/monday_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:name="com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

Фрагмент в диалоговом окне фрагмента затем расширяет свой собственный макет в своем OnCreateView:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        swipe = inflater.inflate(R.layout.day_homework_fragment, container,
                false);

        lView = (ListView) swipe.findViewById(R.id.listView1);

        progress = (ProgressBar) swipe.findViewById(R.id.progress);

        lView.setVisibility(View.GONE);

        return swipe;

    }

Вот макет «day_homework_fragment.xml», который увеличен во фрагменте:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_gravity="center"
    android:background="@color/light_background">

    <ProgressBar
        android:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
         android:background="#ffffff"
         android:divider="@null"
        android:dividerHeight="0dp"
         >
    </ListView>

           <TextView 
           android:id="@+id/emptyView"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:text="As of now, no homework due this day"
           android:padding="30dp" 
           android:textSize="16sp"/>

</LinearLayout>

Вот журнал ошибки, которую он выдает, я пробовал оба этих сообщения и этот пост и ни один из них не устранил проблему.

  10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime: FATAL EXCEPTION: main
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime: Process: com.bernard.beaconportal.activities, PID: 786
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime: android.view.InflateException: Binary XML file line #10: Error inflating class fragment
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:668)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(<Xposed>)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.bernard.beaconportal.activities.schedule.view.MondayView.showDialog(MondayView.java:232)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.bernard.beaconportal.activities.schedule.view.MondayView$1.onClick(MondayView.java:174)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.View.performClick(View.java:4780)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:19867)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5338)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:917)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:  Caused by: java.lang.IllegalStateException: Fragment com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment did not create a view.
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2273)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:278)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v4.app.BaseFragmentActivityDonut.onCreateView(BaseFragmentActivityDonut.java:44)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:78)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV7.callActivityOnCreateView(AppCompatDelegateImplV7.java:842)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV11.callActivityOnCreateView(AppCompatDelegateImplV11.java:34)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:830)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:725)
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:668) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(<Xposed>) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.bernard.beaconportal.activities.schedule.view.MondayView.showDialog(MondayView.java:232) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.bernard.beaconportal.activities.schedule.view.MondayView$1.onClick(MondayView.java:174) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.View.performClick(View.java:4780) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:19867) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5338) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:917) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
    10-11 01:50:40.657 786-786/com.bernard.beaconportal.activities E/AndroidRuntime:     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 

Редактировать: я только что понял, что это начало происходить только после того, как я перешел с eclipse на Android Studio. Может, это как-то связано? Возможно, все ссылки на фрагменты перепутаны?


person I'm_With_Stupid    schedule 11.10.2015    source источник
comment
вы назвали onCreateView или onCreate для своего фрагмента?   -  person Mohammad Tauqir    schedule 11.10.2015
comment
покажите разметку вашего фрагмента day_homework_fragment.xml   -  person selbie    schedule 11.10.2015
comment
@Tauqir Я вызвал oncreateview для своего фрагмента, он раздувает day_homework_fragment   -  person I'm_With_Stupid    schedule 11.10.2015
comment
@selbie добавил разметку для файла day_homework_fragment.xml.   -  person I'm_With_Stupid    schedule 11.10.2015
comment
откуда вы звоните AlertDialog   -  person    schedule 13.10.2015
comment
@penguin из кнопки, которая находится во фрагменте   -  person I'm_With_Stupid    schedule 13.10.2015
comment
где код для вашего mondayfragment?   -  person Bhargav    schedule 20.10.2015
comment
Итак, у вас есть макет с именем monday_fragment и фрагмент с именем monday_fragment? Вы также можете опубликовать код xml для макета monday_fragment ?? Может быть, попробуйте изменить имя макета monday_fragment на monday_layout и посмотреть, что произойдет.   -  person Bhargav    schedule 20.10.2015
comment
Если вы удалите код в OnCreateView(), произойдет ли сбой приложения? Просто для тестирования.   -  person The Original Android    schedule 20.10.2015
comment
Я сделал, и он все равно разбился   -  person I'm_With_Stupid    schedule 20.10.2015
comment
Тогда мы знаем, что проблема не в макете day_homework_fragment.xml. Стыдно, я не знал этого раньше.   -  person The Original Android    schedule 20.10.2015


Ответы (7)


Вы не можете поместить фрагмент внутрь стандартного AlertDialog. Вы должны создать реализацию DialogFragment для добавления фрагмента в ваш диалог. Причина очень проста, так как стандартный фрагмент попытается прикрепиться к корневому окну соответствующей активности, чего не происходит, когда AlertDialog имеет отдельное окно над корневым окном. AlertDialog не может содержать DialogFragment или даже Fragment. Попробуйте изменить код AlertDialog на реализацию DialogFragment.

person JavaGhost    schedule 20.10.2015
comment
Я думаю, у вас есть точка зрения, поэтому я проголосовал за ваш ответ. Ваше предложение, пожалуй, лучшее, на мой взгляд. Однако автор-разработчик, вероятно, не хочет сильно менять код. В данном случае это может быть ошибкой. - person The Original Android; 22.10.2015

Тот факт, что ваш журнал указывает на строку 10, означает, что объявление xml здесь является проблемой, поскольку фрагмент говорит в строке 10:

 android:name="com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment"

Я бы дважды проверил эту ссылку здесь, чтобы увидеть, указывает ли она на правильное место, где вы сохранили класс java для фрагмента.

Кроме того, проверьте в своем классе MondayFragment, что вы расширяете правильный класс Fragment. Другими словами, если вы используете библиотеку поддержки, вам необходимо расширить класс Fragment библиотеки поддержки, а не обычный класс Fragment.

Если ничего не помогает, вы всегда можете программно добавить фрагмент: http://developer.android.com/training/basics/fragments/fragment-ui.html

EDIT: я вижу, что в настоящее время вы увеличиваете свой xml, используя следующий код:

View view = getActivity().getLayoutInflater().inflate(
                R.layout.monday_fragment, null);

Поскольку вы все равно раздуваете его внутри фрагмента, вы не можете просто сказать:

View view = inflater.inflate(R.layout.monday_fragment, null,
                false);
person Simon    schedule 13.10.2015
comment
Я почти уверен, что у меня правильное имя пакета, поскольку даже IDE распознает, что я указываю на правильный фрагмент. Также я использую библиотеку поддержки для своего класса Fragment. - person I'm_With_Stupid; 13.10.2015
comment
Попробуйте файл | Недействительные кеши/перезагрузка в Android Studios. - person Simon; 20.10.2015

Я думаю, что этот код подозрительный:

 View view = getActivity().getLayoutInflater().inflate(
            R.layout.monday_fragment, null);

Первым параметром inflate должно быть имя файла xml, а не идентификатор фрагмента. Возможно, вместо этого вам нужен xml R.layout.day_homework_fragment.

Я знаю, что эти идентификаторы сбивают с толку. Только такие методы, как findViewById(), указывают на идентификатор пользовательского интерфейса.

person The Original Android    schedule 11.10.2015
comment
О, извините, я должен был быть более ясным в своем посте. monday_fragment.xml также является именем макета, содержащего ссылку на фрагмент. Я объясню это более ясно в своем посте. - person I'm_With_Stupid; 11.10.2015
comment
Чтобы уточнить, monday_fragment относится не к идентификатору фрагмента, а к макету xml. - person I'm_With_Stupid; 12.10.2015

Сделайте следующие две вещи:

  1. Проверьте, является ли com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment правильным именем пакета (путь)

  2. В вашем monday_fragment.xml переименуйте android:id="@+id/monday_fragment" в android:id="@+id/monday_fragment1".

    См. следующий код:

    <Fragment
       android:id="@+id/monday_fragment1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:name="com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment"
       android:layout_centerHorizontal="true"/>
    
person Community    schedule 13.10.2015
comment
Я почти уверен, что у меня правильное имя пакета, поскольку даже IDE распознает, что я указываю на правильный фрагмент. Также я только что попробовал # 2, и кажется, что идентификатор ни с чем не конфликтует, поскольку я получаю ту же ошибку. Это странная ошибка, я понятия не имею, что еще попробовать. - person I'm_With_Stupid; 13.10.2015
comment
если вы используете студию Android, удалите все подпапки в [модуль приложения]/build/ и перекомпилируйте проект - person ; 13.10.2015
comment
По-прежнему никаких изменений после удаления папки сборки и перекомпиляции. Теперь, когда я думаю об этом, это начало происходить только после того, как я перешел с eclipse на Android Studio, возможно, это как-то связано с этим. - person I'm_With_Stupid; 13.10.2015

Я считаю, что вам нужно отлаживать сам пакет com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment. Ссылки на пользовательский интерфейс, вероятно, больше недействительны после перехода на Android Studio. Одним из простых способов отладки является удаление кода в OnCreateView().

Если вы импортируете пакет в виде файла jar, это другой случай/проблема.

person The Original Android    schedule 16.10.2015
comment
@I'm_With_Stupid, Итак ... если вы удалите код в OnCreateView, приложение все равно вылетит? - person The Original Android; 20.10.2015

Почему бы вам не использовать фрагмент диалога вместо Alertdialog? Важно, чтобы фрагмент вызывался в рамках действия. Фрагмент диалога будет иметь метод всего жизненного цикла, что облегчит создание любых последующих фрагментов.

person Nitin Mesta    schedule 26.11.2015

Связывание фрагмента через xml часто влечет за собой негативные малозаметные последствия. Делайте это динамически.

Измените свой monday_fragment.xml следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

</FrameLayout>

и измените этот кусок кода:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

View view = getActivity().getLayoutInflater().inflate(
        R.layout.monday_fragment, null);

builder.setView(view).setTitle("Homework Due Monday")
        .setNegativeButton("Dismiss", null);

MondayFragment mondayFragment = new MondayFragment();
getFragmentManager().beginTransaction()
                    .replace(R.id.container, mondayFragment)
                    .commit();

AlertDialog dialog = builder.create();
dialog.show();

Изменить: если это не удается, попробуйте изменить

getFragmentManager().beginTransaction()
        .replace(R.id.container, mondayFragment)
        .commit();

за

getParentFragment().getChildFragmentManager().beginTransaction()
            .replace(R.id.container, mondayFragment)
            .commit();

Изменить попробуем DialogFragment

Пожалуйста, создайте класс DayHomeworkDialogFragment:

public class DayHomeworkDialogFragment extends DialogFragment {

    public DayHomeworkDialogFragment() {
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {


        LayoutInflater inflater = LayoutInflater.from(getActivity());
        View swipe = inflater.inflate(R.layout.day_homework_fragment, null);

        lView = (ListView) swipe.findViewById(R.id.listView1);
        progress = (ProgressBar) swipe.findViewById(R.id.progress);
        lView.setVisibility(View.GONE);



        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity())
                .setView(swipe)
                .setTitle("Homework Due Monday")
                .setPositiveButton("Add", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setNegativeButton("Dismiss",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.dismiss();
                            }
                        }
                );

        return alertDialogBuilder.create();
    }
}

а вместо этого

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        View view = getActivity().getLayoutInflater().inflate(
                R.layout.monday_fragment, null);
        builder.setView(view).setTitle("Homework Due Monday")
                .setNegativeButton("Dismiss", null);

        AlertDialog dialog = builder.create();
        dialog.show(); 

использовать это:

FragmentManager fragmentManager = getFragmentManager();
DayHomeworkDialogFragment dayHomeworkDialogFragment = new DayHomeworkDialogFragment();
dayHomeworkDialogFragment.show(fragmentManager, "my_day_homework_fragment");

если это не удается, попробуйте использовать getChildFragmentManager() вместо getFragmentManager()

person Vitaly Zinchenko    schedule 26.11.2015
comment
Что бы я ни пытался, я получаю эту ошибку. Он утверждает, что R.id.container не существует. Я даже пытался инициировать FrameLayout, прежде чем ссылаться на него с помощью framelayout.getId(). Кажется, ничего не работает. - person I'm_With_Stupid; 28.11.2015
comment
даже getChildFragmentManager() не помог? - person Vitaly Zinchenko; 28.11.2015
comment
Итак, в итоге я сделал com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment DialogFragment вместо Fragment. Я просто хотел бы, чтобы мы могли выяснить, почему это через эту первоначальную ошибку. - person I'm_With_Stupid; 29.11.2015
comment
@I'm_With_Stupid У меня есть некоторые мысли по поводу первоначальной ошибки, но мне нужно время, чтобы прочитать исходный код и проверить некоторые предположения. Когда я закончу, я дам вам знать причину проблемы - person Vitaly Zinchenko; 29.11.2015