illegalstateexception 在屏幕方向改变时没有创建视图

illegalstateexception did not create a view when screen orientation changes

我一直在尝试制作一个从 activity (GradeListActivity) 打开列表视图片段 (GradeListFragment) 的应用程序。当我单击一个项目时,它会打开一个新片段 (GradeDetailFragment)。如果在纵向模式下,它会替换 fragment1 中的列表片段。如果是横向,它会替换空的 fragment2。我的问题是当我切换方向时应用程序崩溃。从两个角度切换得到相同的错误。

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.access0(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);

    }
}

main_activity 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,因为我知道这些不是问题所在。我看过 this 页面,但我不太明白它是如何工作的,所以我无法对其进行测试。我在清单中尝试了 onConfigChange,但我无法更改为适当的布局。如果有人能解决这个问题或解释 link,我将不胜感激。

看看这个文档:

Note: When you add a fragment to an activity layout by defining the fragment in the layout XML file, you cannot remove the fragment at runtime. If you plan to swap your fragments in and out during user interaction, you must add the fragment to the activity when the activity first starts.

因此您不能在运行时替换 R.id.fragment1,例如:

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

然后在运行时实现片段更改的正确方法,您可以使用片段容器 FrameLayoutFragment 替换为您的 R.id.fragment1 为:

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

然后您可以 add/replace 片段 R.id.fragment1.

希望对您有所帮助!