16

我正在升级一个 Android 应用程序(1.6 兼容性),它使用 aTabHost显示 3 个带有嵌套活动的不同选项卡。

当时我使用该ActivityGroup技巧在选项卡中显示嵌套活动,但我对这种方法非常不满意,因为处理某些功能真的很痛苦。

我听说了 1.6 的 Fragments API 兼容性包,并且 aFragment看起来非常适合我想做的事情(在选项卡中显示嵌套视图/功能以及过渡效果和东西),但我不能让它与 a 一起工作TabHost(它的意思是使用 anAction Bar但它在兼容性包中不可用)。

你们中有人找到了在应用程序中创建这种结构的方法吗?

我的错误是:

ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable

启动活动 ComponentInfo{com.XXX}:java.lang.IllegalArgumentException:没有为片段 MyFragment 找到 id 0x1020011 的视图

代码

主要的.xml

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_weight="1" />

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0" />

    </LinearLayout>

</TabHost>

MainActivity.java

public class MainActivity extends TabActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Resources res = getResources();
        final TabHost tabs = getTabHost(); 
        TabHost.TabSpec spec;
        Intent i;

        i = new Intent(this, MyActivity.class);
        spec = tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i);
        tabs.addTab(spec);

    }

}

我的活动.class

public class MyActivity extends FragmentActivity {

    private static String TAG = "MyActivity";
    private static FragmentManager fragmentManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        ListeResultatFragment fragment = MyFragment.newInstance();
        fragmentTransaction.add(android.R.id.tabcontent, fragment, "MyFragment");
        fragmentTransaction.commit();

    }

}

MyFragment.java

public class MyFragment extends Fragment {

    public static MyFragment newInstance() {
        MyFragment instance = new MyFragment();
        return instance;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment, container, false);
    }

}
4

2 回答 2

10

问题是您试图通过使用容器 idMyActivity来接触到封闭物。这是不可能的。相反,需要有自己的布局(例如 FrameLayout),它可以用作 Fragment 的父级。在这个布局中,必须存在一个可以被 id 引用的视图。MainActivityandroid.R.id.tabcontentMyActivity

假设您有一个名为的布局activity_layout.xml,其中包含一个 ID 为“framelayout”的 FrameLayout。然后,您可以将onCreate方法修改为MyActivity如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View parent = getLayoutInflater().inflate(R.layout.activity_layout, null);
    setContentView(parent);

    fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    Fragment fragment = MyFragment.newInstance();
    fragmentTransaction.add(R.id.framelayout, fragment, "MyFragment");
    fragmentTransaction.commit();
}

换句话说,MyActivity需要能够独立工作。尝试先使其工作,然后嵌入MyActivityMainActivity包含 TabHost 中。

于 2011-07-07T20:03:48.750 回答
4

为什么不创建自己的标签栏。它非常容易构建。只需添加一个带有一些按钮的 LinearLayout 并使用 FragmentManager 设置 onClickListener 来切换片段。片段管理器可以从 FragmentActivity 获得。

FragmentManager fragmentManager = getSupportFragmentManager();

在 onClick 处理程序中,您只需执行事务以切换到正确的片段。

于 2011-07-07T17:35:09.683 回答