我正在尝试使用三个垂直面板创建一个布局--2个片段和1个帧布局。第一个片段将是一个选择列表,第二个片段将有不同的内容。从第二个片段中选择一个列表项时,第三个窗格将显示详细信息。
这是我的布局文件:
activity_three_pane.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
android:showDividers="middle"
tools:context=".ActivitySectionList" >
<fragment
android:id="@+id/frg_section_list"
android:name="eam.droid.pt.entholkaappiyam.FragmentSectionList"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
tools:layout="@android:layout/list_content" />
<fragment
android:id="@+id/frg_chapter_list"
android:name="eam.droid.pt.entholkaappiyam.FragmentChapterList"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
tools:layout="@android:layout/list_content" />
<FrameLayout
android:id="@+id/fl_chapter_detail"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
</LinearLayout>
activity_section_list.xml:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frg_section_list"
android:name="eam.droid.pt.entholkaappiyam.FragmentSectionList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
tools:context=".ActivitySectionList"
tools:layout="@android:layout/list_content" />
activity_chapter_list.xml:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frg_chapter_list"
android:name="eam.droid.pt.entholkaappiyam.FragmentChapterList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
tools:context=".ActivityChapterList"
tools:layout="@android:layout/list_content" />
activity_chapter_detail.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fl_chapter_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ActivityChapterDetail"
tools:ignore="MergeRootFrame" />
Java代码如下:
ActivitySectionList.java
public class ActivitySectionList extends FragmentActivity implements FragmentSectionList.Callbacks
FragmentSectionList.java
public class FragmentSectionList extends ListFragment
ActivityChapterList.java
public class ActivityChapterList extends FragmentActivity implements FragmentChapterList.Callbacks
FragmentChapterList.java
public class FragmentChapterList extends ListFragment
ActivityChapterDetail.java
public class ActivityChapterDetail extends FragmentActivity
FragmentChapterDetail.java
public class FragmentChapterDetail extends Fragment
但是应用程序崩溃了Inflate Exception和IllegalStateException。我正在尝试过去两天,但无法找出问题所在。如果有人有意见,请回复。
我注意到的一件事是它在Phone上工作正常,它可以为整个屏幕拍摄单个片段。但平板电脑崩溃,试图在屏幕上放置三个片段。当我调试时,我发现FragmentChapterList.java的OnAttach在ActivityChapterList.java的onCreate之前被调用。这就是原因,它给出了IllegaltStateException:Activity必须实现片段的回调。所以,我试图在ActivitySectionList.java中实现两个片段回调。
像这样:public class ActivitySectionList extends FragmentActivity implements FragmentSectionList.Callbacks, FragmentChapterList.Callbacks
然后它在平板电脑上正常工作。但是,无法检索电话上的章节列表。
这是我的logcat:
02-12 14:14:55.858: E/AndroidRuntime(989): FATAL EXCEPTION: main
02-12 14:14:55.858: E/AndroidRuntime(989): java.lang.RuntimeException: Unable to start activity ComponentInfo{eam.droid.pt.entholkaappiyam/eam.droid.pt.entholkaappiyam.ActivitySectionList}: android.view.InflateException: Binary XML file line #20: Error inflating class fragment
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.ActivityThread.access$600(ActivityThread.java:130)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.os.Looper.loop(Looper.java:137)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.ActivityThread.main(ActivityThread.java:4745)
02-12 14:14:55.858: E/AndroidRuntime(989): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 14:14:55.858: E/AndroidRuntime(989): at java.lang.reflect.Method.invoke(Method.java:511)
02-12 14:14:55.858: E/AndroidRuntime(989): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-12 14:14:55.858: E/AndroidRuntime(989): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-12 14:14:55.858: E/AndroidRuntime(989): at dalvik.system.NativeStart.main(Native Method)
02-12 14:14:55.858: E/AndroidRuntime(989): Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class fragment
02-12 14:14:55.858: E/AndroidRuntime(989): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
02-12 14:14:55.858: E/AndroidRuntime(989): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.Activity.setContentView(Activity.java:1867)
02-12 14:14:55.858: E/AndroidRuntime(989): at eam.droid.pt.entholkaappiyam.ActivitySectionList.onCreate(ActivitySectionList.java:20)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.Activity.performCreate(Activity.java:5008)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
02-12 14:14:55.858: E/AndroidRuntime(989): ... 11 more
02-12 14:14:55.858: E/AndroidRuntime(989): Caused by: java.lang.IllegalStateException: Activity must implement fragment's callbacks.
02-12 14:14:55.858: E/AndroidRuntime(989): at eam.droid.pt.entholkaappiyam.FragmentChapterList.onAttach(FragmentChapterList.java:84)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:867)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280)
02-12 14:14:55.858: E/AndroidRuntime(989): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
有谁能告诉我哪里可能出错了?如果有人遇到3个垂直面板的教程或示例(2个列表和1个细节),请指出我。
以下是详细方案:
答案 0 :(得分:3)
我假设activity_three_pane.xml
只会在平板电脑和ActivitySectionList
课程中被夸大。在这种情况下,对于平板电脑,片段FragmentSectionList
和FragmentChapterList
都会作为布局的一部分而膨胀,因此您需要在ActivitySectionList
中实现回调,这是您的例外的来源
此设置似乎非常复杂且令人困惑。我建议拆分您的活动,这样您就不会重叠代码。这将帮助您更轻松地诊断问题,并清理代码。例如:
public class BookActivity extends FragmentActivity implements FragmentSectionList.Callbacks, FragmentChapterList.Callbacks
{
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_three_pane);
}
}
public class ActivitySectionList extends FragmentActivity implements FragmentSectionList.Callbacks
{
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_section_list);
}
}
然后在任何称这些活动的活动中:
if( ( getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK ) == Configuration.SCREENLAYOUT_SIZE_XLARGE ) {
startActivity( new Intent(this, BookActivity.class);
}
else {
startActivity( new Intent(this, ActivitySectionList.class);
}
答案 1 :(得分:1)
您的活动是否扩展了FragmentActivity?..如果不尝试扩展FragmentActivity而不仅仅是Activity。
答案 2 :(得分:1)
一个疯狂的猜测:FragmentActivity(支持库)是否正在使用Fragment(非支持库)?如果是这种情况:确保您坚持使用支持库(检查导入)或使用Android 3 +。
答案 3 :(得分:0)
听起来像FragmentChapterList正在扩展android.app.ListFragment而不是正确的android.support.v4.app.ListFragment。我会在FragmentChapterList中检查你的导入,以确保ListFragment导入实际上是支持库版本。