Не удалось создать представление, когда изменения ориентации экрана

Я пытаюсь создать приложение, которое открывает фрагмент listview (GradeListFragment) из активности (GradeListActivity). Когда я нажимаю элемент, он открывает новый фрагмент (GradeDetailFragment). Если в портретном режиме он заменяет фрагмент списка в фрагменте1. Если в ландшафте, он заменяет пустой фрагмент2. Моя проблема в том, что приложение отключается при переключении ориентации. Переключение с обеих сторон получает ту же ошибку.

04-09 12:10:52.240: E/AndroidRuntime(2221): FATAL EXCEPTION: main 04-09 12:10:52.240: E/AndroidRuntime(2221): Process: bcs421.christophergoepfert.hwk.gradeapp.presentation, PID: 2221 04-09 12:10:52.240: E/AndroidRuntime(2221): java.lang.RuntimeException: Unable to start activity ComponentInfo{bcs421.christophergoepfert.hwk.gradeapp.presentation/bcs421.christ ophergoepfert.hwk.gradeapp.presentation.GradeListActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3912) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.ActivityThread.access$900(ActivityThread.java:144) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.os.Handler.dispatchMessage(Handler.java:102) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.os.Looper.loop(Looper.java:135) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.ActivityThread.main(ActivityThread.java:5221) 04-09 12:10:52.240: E/AndroidRuntime(2221): at java.lang.reflect.Method.invoke(Native Method) 04-09 12:10:52.240: E/AndroidRuntime(2221): at java.lang.reflect.Method.invoke(Method.java:372) 04-09 12:10:52.240: E/AndroidRuntime(2221): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 04-09 12:10:52.240: E/AndroidRuntime(2221): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 04-09 12:10:52.240: E/AndroidRuntime(2221): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 04-09 12:10:52.240: E/AndroidRuntime(2221): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:377) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.Activity.setContentView(Activity.java:2144) 04-09 12:10:52.240: E/AndroidRuntime(2221): at bcs421.christophergoepfert.hwk.gradeapp.presentation.GradeListActivity.onCreate(GradeListActivity.java:29) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.Activity.performCreate(Activity.java:5933) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 04-09 12:10:52.240: E/AndroidRuntime(2221): ... 11 more 04-09 12:10:52.240: E/AndroidRuntime(2221): Caused by: java.lang.IllegalStateException: Fragment android.app.ListFragment did not create a view. 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2145) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.app.Activity.onCreateView(Activity.java:5282) 04-09 12:10:52.240: E/AndroidRuntime(2221): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733) 

MainActivity не сбой при перезапуске.

 public class MainActivity extends Activity{ public GradeCollection collection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //grade data } } public void startGradeListActivity(View v){ Intent i = new Intent(MainActivity.this, GradeListActivity.class); //putextra gradecollection startActivity(i); } } 

Основной_активность xml

 <TextView android:id="@+id/textViewName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/name" /> <RatingBar android:id="@+id/ratingBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="4" android:stepSize="1" /> <TextView android:id="@+id/textViewGradeNumber" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/gradeNumber" /> <TextView android:id="@+id/textViewGradeLetter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" /> <Button android:id="@+id/buttonViewGrades" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="startGradeListActivity" android:text="@string/viewGrades" /> 

GradeListActivity падает на ft.commit (); возможно, проблема в том, что я импортирую android.support.v4.app.FragmentActivity ;?

 public class GradeListActivity extends FragmentActivity { //private GradeCollection listGrades; //private ArrayList<String> listCatagory; //private ArrayAdapter<String> listAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.catagory_list); ListFragment fragment = new GradeListFragment(); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.fragment1, fragment); ft.commit(); } } 

Это GradeListFragment.

 public class GradeListFragment extends ListFragment{ @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); View v = inflater.inflate(R.layout.fragment_category, container, false); //data handling return v; } } 

Вот xml для портрета catagory_list

 <fragment android:id="@+id/fragment1" android:name="android.app.ListFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1.03" /> 

И вот пейзаж

 <fragment android:id="@+id/fragment1" android:name="android.app.ListFragment" android:layout_width="271dp" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/fragment2" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Я пропустил переданные фактические данные, а также GradeDetailFragment, потому что я знаю, что это не проблема. Я видел эту страницу, но я действительно не понимаю, как она работает, поэтому я не могу ее протестировать. Я пробовал onConfigChange в манифесте, но потом я не могу изменить соответствующий макет. Если бы кто-нибудь мог решить эту проблему или объяснить ссылку, я был бы очень благодарен.

Посмотрите этот документ:

Примечание. Когда вы добавляете фрагмент в макет действия, определяя фрагмент в XML-файле макета, вы не можете удалить фрагмент во время выполнения. Если вы планируете включать и отключать свои фрагменты во время взаимодействия с пользователем, вы должны добавить фрагмент к активности при первом запуске.

Поэтому вы не можете заменить R.id.fragment1 во время выполнения, например:

 ft.replace(R.id.fragment1, fragment); //wrong 

FrameLayout правильный способ реализации изменения фрагмента во время выполнения, вы можете использовать FrameLayout контейнер FrameLayout для замены Fragment для вашего R.id.fragment1 следующим образом:

 <FrameLayout android:id="@+id/fragment1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1.03" /> 

R.id.fragment1 вы можете добавить / заменить фрагмент в R.id.fragment1 .

Надеюсь эта помощь!