我正在升级一个安卓应用程序(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
<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);
}
}
发布于 2011-07-08 04:03:49
问题是您的MyActivity
试图通过使用android.R.id.tabcontent
作为容器id来访问封闭的MainActivity
。这是不可能的。相反,MyActivity
需要有自己的布局(例如FrameLayout),可以用作片段的父级。在这个布局中,必须存在一个可以通过id引用的视图。
假设您有一个名为activity_layout.xml
的布局,其中包含一个id为' 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
需要能够独立工作。首先尝试让它工作,然后在包含TabHost的MainActivity
中嵌入MyActivity
。
发布于 2011-07-08 01:35:10
你为什么不创建你自己的标签栏呢?它非常容易构建。只需添加一个包含一些按钮的LinearLayout,并使用FragmentManager将onClickListener设置为切换片段。片段管理器可以从FragmentActivity获得。
FragmentManager fragmentManager = getSupportFragmentManager();
在onClick处理程序中,您只需将事务切换到正确的片段即可。
https://stackoverflow.com/questions/6556746
复制相似问题