Android的1.6安培;片段放; Tabhost [英] Android 1.6 & Fragment & Tabhost

查看:148
本文介绍了Android的1.6安培;片段放; Tabhost的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在升级的Andr​​oid应用程序(1.6兼容),它使用一个 TabHost 显示3个不同的选项卡嵌套活动。​​

当时我用了的ActivityGroup 诱骗显示在标签内嵌活动,但我很不满意这种方法,因为它是一个真正的痛苦,以处理某些功能。

我听说片段API兼容性包1.6和片段看上去很适合我想要做的(显示嵌套视图/选项卡中的功能与过渡效果和的东西),但我不能使它与上班 TabHost (它本来是一起工作的操作栏但它不是可以在兼容包)。

有没有任何你们发现了一种在应用程序中创建这样一个结构呢?

我在这里的错误是:

  ERROR / AndroidRuntime(955):java.lang.RuntimeException的:产生的原因无法
 

要启动活动   ComponentInfo {com.XXX}:   java.lang.IllegalArgumentException异常:无   查看发现的ID 0x1020011的   片段MyFragment

code

的main.xml

 < TabHost的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@机器人:ID / tabhost
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT>

    <的LinearLayout
        机器人:方向=垂直
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =FILL_PARENT>

        <的FrameLayout
            机器人:ID =@机器人:ID / tabcontent
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
            机器人:填充=5DP
            机器人:layout_weight =1/>

        < TabWidget
            机器人:ID =@机器人:ID /标签
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_weight =0/>

    < / LinearLayout中>

< / TabHost>
 

MainActivity.java

 公共类MainActivity扩展TabActivity {

    @覆盖
    公共无效的onCreate(包savedInstanceState){

        super.onCreate(savedInstanceState);

        的setContentView(R.layout.main);

        资源RES = getResources();
        最终TabHost标签= getTabHost();
        TabHost.TabSpec规范;
        我的意图;

        I =新的意图(这一点,MyActivity.class);
        规格= tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i);
        tabs.addTab(规范);

    }

}
 

MyActivity.class

 公共类MyActivity扩展FragmentActivity {

    私有静态字符串变量=MyActivity;
    私有静态FragmentManager fragmentManager;

    @覆盖
    保护无效的onCreate(包savedInstanceState){

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

    }

}
 

MyFragment.java

 公共类MyFragment扩展片段{

    公共静态MyFragment的newInstance(){
        MyFragment实例=新MyFragment();
        返回实例;
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
        返回inflater.inflate(R.layout.fragment,集装箱,假);
    }

}
 

解决方案

现在的问题是,你的 MyActivity 试图伸手向封闭 MainActivity 通过使用 android.R.id.tabcontent 作为容器的id。这是不可能的。相反, MyActivity 需要有其自己的布局(例如,一个的FrameLayout),它可以用作父的片段。在此布局,必须存在,可以通过标识引用的图。

假设你有一个叫做布局 activity_layout.xml ,其中包含了ID的FrameLayout'一的FrameLayout。然后,您可以修改的onCreate 方法 MyActivity 来是这样的:

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    查看父= getLayoutInflater()膨胀(R.layout.activity_layout,空)。
    的setContentView(父);

    fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    片段片段= MyFragment.newInstance();
    fragmentTransaction.add(R.id.framelayout,片段,MyFragment);
    fragmentTransaction.commit();
}
 

在换句话说, MyActivity 需要能够工作在其自身。尽量让它先工作,然后在 MainActivity 含有TabHost。

中嵌入 MyActivity

I'm working on upgrading an Android application (1.6 compatibility) which uses a TabHost to show 3 different tabs with nested activities.

At the time I used the ActivityGroup trick to show nested activities in a tab but I'm very unhappy with this method since it's a real pain to handle some features.

I heard about the Fragments API compatibility package for 1.6 and a Fragment looks perfect for what I want to do (show nested views / features within a tab with transition effects and stuff) but I can't make it work with a TabHost (It was meant to work with an Action Bar but it's not available in the compatibility package).

Did any of you guys found a way to create such a structure in your applications?

My error here is :

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

to start activity ComponentInfo{com.XXX}: java.lang.IllegalArgumentException: No view found for id 0x1020011 for fragment MyFragment

CODE

main.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);

    }

}

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

}

解决方案

The problem is that your MyActivity tries to reach out to the enclosing MainActivity by using android.R.id.tabcontent as a container id. This is not possible. Instead, MyActivity needs to have its own layout (e.g. a FrameLayout) which can be used as the parent for the Fragment. In this layout, there must exist a view that can be referenced by id.

Let's say you have a layout called activity_layout.xml which contains a FrameLayout with the id 'framelayout'. You can then modify the onCreate method in MyActivity to something like this:

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

In other words, MyActivity needs to be able to work on its own. Try to make it work first, and then embed MyActivity in the MainActivity containing the TabHost.

这篇关于Android的1.6安培;片段放; Tabhost的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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