Android 1.6&Fragment&Tabhost

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

当时我使用ActivityGroup技巧来显示标签中的嵌套活动,但是我对这个方法非常不满意,因为处理一些特性是一个真正的痛苦。

我听说1.6的Fragments API兼容性包, Fragment看起来非常适合我想做的事情(显示带有转换效果和内容的选项卡中的嵌套视图/function),但是我无法使用TabHost工作(这是意味着使用一个Action Bar但在兼容性包中不可用)。

你们中有没有人find了在你的应用程序中创build这种结构的方法?

我的错误是:

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

开始活动ComponentInfo {com.XXX}:java.lang.IllegalArgumentException:没有findid为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); } } 

Solutions Collecting From Web of "Android 1.6&Fragment&Tabhost"

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

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

 @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需要能够独立工作。 尝试使其工作,然后将MyActivityembedded到包含MyActivityMainActivity中。

你为什么不创build自己的tabbar。 这很容易build立。 只需添加一个带有一些button的LinearLayout,并通过使用FragmentManager设置onClickListener来切换片段。 片段pipe理器可以从FragmentActivity获得。

 FragmentManager fragmentManager = getSupportFragmentManager(); 

在onClick处理程序中,您只需对交换机执行正确的碎片事务。