Android的碎片 - 2片段放; 1框架布局 [英] Android Fragments - 2 Fragment & 1 Frame Layout

本文介绍了Android的碎片 - 2片段放; 1框架布局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个具有三个垂直面板布局 - 2碎片和1框架布局。第一片段将在选择的列表,第二片段将具有不同的内容。在选择从2号片段的列表项,第3窗格中会显示详细信息。

I am trying to create a layout with three vertical panel - 2 fragments and 1 frame layout. 1st fragment will be a list on selection, 2nd fragment will have different content. on selecting a list item from 2nd fragment, 3rd pane will show the details.

下面是我的布局文件:

activity_three_pane.xml:

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:

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:

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:

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的code是这样的:

The Java code goes like this:

ActivitySectionList.java

ActivitySectionList.java

public class ActivitySectionList extends FragmentActivity implements FragmentSectionList.Callbacks

FragmentSectionList.java

FragmentSectionList.java

public class FragmentSectionList extends ListFragment

ActivityChapterList.java

ActivityChapterList.java

public class ActivityChapterList extends FragmentActivity implements FragmentChapterList.Callbacks

FragmentChapterList.java

FragmentChapterList.java

public class FragmentChapterList extends ListFragment

ActivityChapterDetail.java

ActivityChapterDetail.java

public class ActivityChapterDetail extends FragmentActivity

FragmentChapterDetail.java

FragmentChapterDetail.java

public class FragmentChapterDetail extends Fragment

但随着膨胀的异常和IllegalStateException异常应用程序崩溃。我想在过去的两年一天,但不能找出问题所在。如果任何人有想法就可以了,请回复。

But the application crashes with Inflate Exception and IllegalStateException. I am trying for the past two day but cant find out where the problem is. If anyone has idea on it, please reply.

Onething我注意到的是,它工作正常,在电话这需要各个片段整个屏幕。但在平板电脑崩溃,它试图在屏幕上容纳三个片段。当我调试,我才知道,FragmentChapterList.java的OnAttach被ActivityChapterList.java的onCreate之前调用。这就是为什么,它提供了IllegaltStateException:活动必须实现片段的回调。所以,我试图同时实现片段中ActivitySectionList.java回调。

Onething I noticed is that it works fine on Phone which takes individual fragment for whole screen. But crashes on Tablet which tries to fit three fragments on the screen. When I debugged, I came to know that FragmentChapterList.java's OnAttach gets called before ActivityChapterList.java's onCreate. That's why, it gives the IllegaltStateException: Activity must implement fragment's callback. so, I tried to implement both the fragments callbacks within ActivitySectionList.java.

是这样的:

public class ActivitySectionList extends FragmentActivity implements FragmentSectionList.Callbacks, FragmentChapterList.Callbacks

然后正常工作的平板电脑。但是,不能够检索电话章节列表。

Then it works fine on Tablet. But, not able to retrieve Chapter List on Phone.

下面是我的logcat:

Here's my 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)

谁能告诉我在哪里mightbe的问题呢?如果有人遇到教程或例如3个垂直面板(2列表和1的细节),请点我吧。

Can anyone please tell me where I mightbe going wrong? If anyone comes across tutorial or example of 3 vertical panel(2 list and 1 detail), please point me to it.

下面是详细情况:

推荐答案

我假设 activity_three_pane.xml 只被充气的平板电脑,并在 ActivitySectionList 类。在这种情况下,平板电脑,这两个片段 FragmentSectionList FragmentChapterList 充气作为布局的一部分,因此需要在 ActivitySectionList 实现回调两个,这是你的异常的根源。

I'm assuming that activity_three_pane.xml only gets inflated for tablets, and in the ActivitySectionList class. In this case, for tablets, both fragments FragmentSectionList and FragmentChapterList are inflated as part of your layout, thus you need to implement callbacks for both in ActivitySectionList, which is the source of your exception.

此设置似乎很令人费解和困惑。我建议你​​分裂活动,这样你就不会重叠code。这将帮助你诊断问题要容易得多,而且清理code。例如:

This setup seems very convoluted and confusing. I would recommend splitting your activities so you're not overlapping code. This will help you diagnose problems much easier, and clean up your code. Example:

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);
    }
}

然后在任何的活动,称这些activites:

Then in whichever activity that calls these activites:

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);
}

这篇关于Android的碎片 - 2片段放; 1框架布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆