我一直在尝试创建一个从活动(GradeListActivity)打开listview片段(GradeListFragment)的应用程序。单击某个项目时,它会打开一个新片段(GradeDetailFragment)。如果处于纵向模式,它将替换fragment1中的列表片段。如果在横向中,它将替换空片段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);
}
}
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;
}
}
这是catagory_list肖像的xml
<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,但后来我无法更改为适当的布局。如果有人能解决这个问题或解释链接,我将非常感激。
答案 0 :(得分:15)
看这个文档:
注意:通过在布局XML文件中定义片段将片段添加到活动布局时,无法在运行时删除片段。如果您计划在用户交互期间将片段交换进出,则必须在活动首次开始时将片段添加到活动中。
所以你不能在运行时替换R.id.fragment1
,如:
ft.replace(R.id.fragment1, fragment); //wrong
然后在运行时实现片段更改的正确方法,您可以使用片段容器FrameLayout
替换Fragment
的{{1}}:
R.id.fragment1
然后你可以在<FrameLayout
android:id="@+id/fragment1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.03" />
中添加/替换片段。
希望这有帮助!