首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android 1.6 & Fragment & Tabhost

Android 1.6 & Fragment & Tabhost
EN

Stack Overflow用户
提问于 2011-07-02 19:33:43
回答 2查看 9.9K关注 0票数 16

我正在升级一个安卓应用程序(1.6兼容性),它使用一个TabHost来显示3个不同的标签与嵌套的活动。

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

我听说过Fragments兼容性包1.6,Fragment看起来非常适合我想做的事情(在带有过渡效果的选项卡中显示嵌套视图/特性),但我不能让它与TabHost一起工作(它本打算与Action Bar一起使用,但兼容性包中没有它)。

你们中有谁找到了在应用程序中创建这样一个结构的方法吗?

我这里的错误是:

错误/AndroidRuntime(955):由: java.lang.RuntimeException: Unable引起

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

代码

main.xml

代码语言:javascript
复制
<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

代码语言:javascript
复制
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);

    }

}

MyActivity.class

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-08 04:03:49

问题是您的MyActivity试图通过使用android.R.id.tabcontent作为容器id来访问封闭的MainActivity。这是不可能的。相反,MyActivity需要有自己的布局(例如FrameLayout),可以用作片段的父级。在这个布局中,必须存在一个可以通过id引用的视图。

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

代码语言:javascript
复制
@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需要能够独立工作。首先尝试让它工作,然后在包含TabHost的MainActivity中嵌入MyActivity

票数 10
EN

Stack Overflow用户

发布于 2011-07-08 01:35:10

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

代码语言:javascript
复制
FragmentManager fragmentManager = getSupportFragmentManager();

在onClick处理程序中,您只需将事务切换到正确的片段即可。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6556746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档