Фрагмент, завышенный в Fragment Dialog, вызывает ошибку "Фрагмент не создал вид"
Пользователь нажимает кнопку, которая вызывает диалог фрагмента, который раздувает фрагмент следующим образом:
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. Может быть, это как-то связано с этим? Возможно, все ссылки на фрагменты перепутаны?
Ответы
Ответ 1
Тот факт, что ваш журнал указывает на строку 10, означает, что объявление xml здесь является проблемой, поскольку фрагмент говорит в строке 10:
android:name="com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment"
Я бы дважды проверил эту ссылку, чтобы узнать, указывает ли она на то место, где вы сохранили класс java для фрагмента.
Кроме того, проверьте свой класс MondayFragment, что вы расширяете правильный класс фрагмента. Другими словами, если вы используете библиотеку поддержки, вам необходимо расширить класс 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);
Ответ 2
Вы не можете поместить фрагмент в стандартный AlertDialog
. Вы должны создать реализацию DialogFragment
для добавления фрагмента в ваш диалог. Причина очень проста, так как стандартный фрагмент попытается присоединить себя к корневому окну соответствующего действия, которое не соответствует тому, когда AlertDialog
имеет отдельное окно над корневым окном. AlertDialog
не может содержать DialogFragment
или даже Fragment
. Попробуйте изменить код AlertDialog
на реализацию DialogFragment
.
Ответ 3
Я думаю, что этот код подозрительный:
View view = getActivity().getLayoutInflater().inflate(
R.layout.monday_fragment, null);
Первым параметром inflate
должно быть имя файла xml вместо идентификатора фрагмента. Возможно, вместо xml R.layout.day_homework_fragment.
Я знаю, что эти идентификаторы сбивают с толку. Только такие методы, как findViewById
(), указывают на идентификатор интерфейса.
Ответ 4
Сделайте следующие две вещи:
-
Проверьте, соответствует ли com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment
имя пакета (путь)
-
В вашем 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"/>
Ответ 5
Я считаю, что вам нужно отлаживать сам пакет com.bernard.beaconportal.activities.schedule.daydialogfragments.MondayFragment
. Ссылки на UI, вероятно, больше не действительны после перехода на Android Studio. Один простой способ отладки - удалить код в OnCreateView()
.
Если вы импортируете пакет как файл jar, то это другой случай/проблема.
Ответ 6
Почему бы вам не использовать фрагмент диалога вместо Alertdialog? Его важно для того, чтобы frgament вызывался в области действия. И фрагмент диалога будет иметь весь метод жизненного цикла и который облегчит создание любых последующих фрагментов.
Ответ 7
Связывание фрагмента через 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()