Android 1.6 & Fragment & Tabhost



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

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

我听说Fragments API 1.6兼容包,Fragment非常适合我想要做的事情(在带有过渡效果的选项卡中显示嵌套视图/功能(,但我无法使其与TabHost一起使用(它本应与Action Bar一起使用,但在兼容包中不可用(。

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

我的错误是:

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

开始活动组件信息{com.XXX}:java.lang.IollegalArgumentException:否为找到id为0x1020011的视图片段MyFragment

代码

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

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

假设您有一个名为activity_layout.xml的布局,其中包含一个id为"FrameLayout"的FrameLayout。然后,您可以将MyActivity中的onCreate方法修改为以下内容:

@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需要能够独立工作。首先尝试使其工作,然后将MyActivity嵌入到包含TabHost的MainActivity中。

为什么不创建自己的选项卡呢。它非常容易建造。只需添加一个带有一些按钮的LinearLayout,并设置onClickListener以使用FragmentManager切换片段。Fragment管理器可以从FragmentActivity中获得。

FragmentManager fragmentManager = getSupportFragmentManager();

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

相关内容

  • 没有找到相关文章

最新更新