我正在升级Android应用程序(1.6兼容性),该应用程序使用TabHost显示三个带有嵌套活动的不同选项卡。
TabHost
当时,我使用ActivityGroup技巧在选项卡中显示嵌套的活动,但是我对此方法感到非常不满意,因为处理某些功能确实很麻烦。
ActivityGroup
我听说过1.6版的Fragments API兼容性软件包,并且Fragment看起来非常适合我想做的事情(在带有过渡效果和内容的选项卡中显示嵌套视图/功能),但我无法使其与TabHost(这是为了与一起使用,Action Bar但在兼容性包中不可用)。
Fragment
Action Bar
你们有没有找到一种在您的应用程序中创建这种结构的方法?
我的错误是:
ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable 开始活动ComponentInfo {com.XXX}:java.lang.IllegalArgumentException:找不到片段MyFragment的ID 0x1020011的视图
ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable
开始活动ComponentInfo {com.XXX}:java.lang.IllegalArgumentException:找不到片段MyFragment的ID 0x1020011的视图
码
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尝试MainActivity通过将其android.R.id.tabcontent用作容器ID 来接触到该附件。这是不可能的。相反,MyActivity需要具有自己的布局(例如FrameLayout),可以用作Fragment的父级。在此布局中,必须存在可以由id引用的视图。
MyActivity
MainActivity
android.R.id.tabcontent
假设您有一个名为的布局activity_layout.xml,其中包含ID为’framelayout’的FrameLayout。然后,您可以将onCreate方法修改为MyActivity如下所示:
activity_layout.xml
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 MyActivity的MainActivity容器中。