【发布时间】:2011-09-27 06:10:12
【问题描述】:
我正在升级一个 Android 应用程序(兼容 1.6),它使用 TabHost 来显示 3 个不同的选项卡和嵌套的活动。
当时我使用ActivityGroup 技巧在选项卡中显示嵌套活动,但我对这种方法非常不满意,因为处理某些功能真的很痛苦。
我听说了 1.6 的 Fragments API 兼容性包,Fragment 看起来非常适合我想要做的事情(在选项卡中显示嵌套视图/功能以及过渡效果和内容),但我无法使用它一个TabHost(它本来是为了和Action Bar一起工作,但它在兼容性包中不可用)。
你们有没有找到一种方法在您的应用程序中创建这样的结构?
我的错误是:
ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable开始活动 组件信息{com.XXX}: java.lang.IllegalArgumentException:否 为 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);
}
}
【问题讨论】:
-
您是说不能将
<fragment>元素作为FrameLayout的子元素放在TabHost中吗?我原以为这会起作用,但我还没有亲自尝试过。 -
请准确解释我不工作的地方。请记住,您始终可以通过编程方式添加片段。
-
知道为什么我无法获取 android.R.id.tabcontent 中显示的内容吗?
-
ActionBar在兼容包中不可用,但您可以使用github.com/JakeWharton/ActionBarSherlock
标签: java android android-fragments android-tabhost activitygroup