Android片段无效

时间:2011-12-29 00:04:56

标签: java android android-fragments

我正在尝试在android中实现一个简单的片段。

我尝试了各种方法,唯一一次我没有得到错误的是当我从布局中完全删除片段时。除此之外,我已经删除了inflate,并尝试手动创建一个布局,但也无法正常工作。

仅从布局中删除fragment似乎会使应用程序加载,无论我做什么,应用程序都会崩溃。

我一直收到以下错误:

  

12-29 04:52:07.493:E / AndroidRuntime(11717):   java.lang.RuntimeException:无法恢复活动   {com.p5sys.android.jump / com.p5sys.android.jump.lib.activities.DisplayContactList}:   android.view.InflateException:二进制XML文件行#9:错误   膨胀类片段

在上述错误堆栈跟踪之后我也会收到以下错误(只是分享它有帮助)。

  

12-29 04:52:07.493:E / AndroidRuntime(11717):引起:   java.lang.IllegalArgumentException:二进制XML文件行#9:重复   id为0x7f090023,标记为null或父id为0x0,其中包含另一个片段   com.p5sys.android.jump.lib.fragment.HeaderFragment

我的布局contact_layout.xml是一个LinearLayout,其中包含fragmentListView

<fragment
    android:id="@+id/headerFragment"
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    class="com.p5sys.android.jump.lib.fragment.HeaderFragment" />

<ListView
    android:id="@+id/contactList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:background="@color/transparent"
    android:cacheColorHint="#00000000" >
</ListView>

片段布局header_fragment.xml是:

<TableRow>
    <ImageButton
        android:id="@+id/btnSettings"
        android:gravity="left"
        android:hint="@string/label_settings"
        android:onClick="btnAction_launchSettings"
        android:padding="3dip"
        android:src="@drawable/ic_menu_add" />

    <TextView
        android:id="@+id/headerText"
        android:gravity="center"
        android:height="50dip"
        android:padding="3dip"
        android:textSize="20sp"
        android:textStyle="bold"
        android:text="Blank" />

    <ImageButton
        android:id="@+id/btnAdd"
        android:background="@drawable/disconnectbutton"
        android:gravity="right"
        android:hint="@string/label_add"
        android:onClick="btnAction_launchAddNew"
        android:padding="3dip"
        android:src="@drawable/ic_menu_add" />
</TableRow>

My Fragment课程:

package com.p5sys.android.jump.lib.fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.p5sys.android.jump.lib.R;
/***
 * Fragment
 * @author Ali
 *
 */
public class HeaderFragment extends Fragment {

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // inflate layout
        return inflater.inflate(R.layout.header_fragment, container, false);
//      LinearLayout ll = new LinearLayout(getActivity());
//      TextView tv = new TextView(getActivity());
//      tv.setText("hello world");
//      ll.addView(tv);
//      return ll;
    }
}

在我的活动中,我没有做任何特别的事情,我尝试过使用常规Activity以及FragmentActivity,我遇到了同样的问题。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我自己从来没有幸运过这种方法。此外,如果您希望在布局中的同一位置实例化多种类型的片段,或者用手指轻扫许多片段实例(通过ViewPager),您将不得不以不同方式执行此操作。等等。

所以这就是我的工作:1)使用FrameLayout为片段保留空间。

<FrameLayout
    android:id="@+id/where_i_want_my_fragment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

2)使用以下Java代码实例化片段:

FragmentManager fragMgr = getFragmentManager();
FragmentTransaction xact = fragMgr.beginTransaction();
if (null == fragMgr.findFragmentByTag(myFragTag)) {
    xact.add(R.id.where_i_want_my_fragment, MyDerivedFragment.newInstance(), myFragTag).commit();
}

myFragTag是您需要提出的String值。它是您要分配给Fragment实例的标记名称,类似于HTML中的“id”属性。如果你只有一个Fragment实例,那么你可以随意调用它;否则,最好将标记名称指定为与特定实例出现的内容相关的内容。

不要忘记最后的commit()部分,否则它将无效!

答案 1 :(得分:0)

如果您想要与您的片段进行交互(甚至可能与您的片段进行交互),您的活动需要是片段活动。

您收到此错误的原因是TableRow不是有效的父级。您需要使用某种ViewGroup布局。我不知道你为什么在这里使用tablerow,但你不应该使用它。尝试使用水平线性布局。如果目标是具有均匀间距,则将所有内容的布局权重设置为1 xml。

否则你发布的内容看起来不错......