Android Fragments - 2 Fragment& 1帧布局

时间:2013-02-12 19:21:06

标签: android android-layout android-fragments android-listfragment android-fragmentactivity

我正在尝试使用三个垂直面板创建一个布局--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个细节),请指出我。

以下是详细方案:

4 个答案:

答案 0 :(得分:3)

我假设activity_three_pane.xml只会在平板电脑和ActivitySectionList课程中被夸大。在这种情况下,对于平板电脑,片段FragmentSectionListFragmentChapterList都会作为布局的一部分而膨胀,因此您需要在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导入实际上是支持库版本。