
"你不能替换静态定义的布局文件中的一个片段。您仅可替换你动态地添加通过 FragmentTransaction 的片段"
请参阅
Android: 不能替换另一个的一个片段
如何显示一个选项卡内的一个新片段?
这里是解决方案。
在 home_activity.xml,你应该离开空你 tabcontent。
<FrameLayout
android:id="@+id/tabcontent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
您的 Home_Activity
private FragmentTabHost mHost
public void changeFragment() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction()
EntertainmentFragment enFragment = new EntertainmentFragment()
ft.replace(R.id.tabcontent, enFragment)
ft.commit()
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mHost = (FragmentTabHost) findViewById(android.R.id.tabhost)
mHost.setup(this, getSupportFragmentManager(), R.id.tabcontent)
mHost.addTab(mHost.newTabSpec("School")
.setIndicator("School"), SchoolFragment.class, null)
mHost.addTab(mHost.newTabSpec("Sport")
.setIndicator("Sport"), SportsFragment.class, null)
}
在您的 onIemClick (Sports_Fragment),添加这
MainActivity mainAct = (MainActivity)getActivity()
mainAct.changeFragment()
我充分的项目,基于您的代码,是在这里。
我还没有机会真的检查 TabHost 为什么不工作时我测试您的代码。但FragmentTabHost的作品对我很好。
编辑: 若要修复重叠问题,您可以设置 OnTabChangeListener:
mHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
// TODO Auto-generated method stub
if (tabId.equalsIgnoreCase("School")) {
Log.v(TAG, "school")
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction()
schoolFrag = new SchoolFragment()
ft.replace(R.id.tabcontent, schoolFrag)
ft.commit()
}
if (tabId.equalsIgnoreCase("Sport")) {
Log.v(TAG, "Sport")
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction()
SportsFragment sportFrag = new SportsFragment()
ft.replace(R.id.tabcontent, sportFrag)
ft.commit()
}
}
})
关于 backpress,您可以尝试
ft.addToBackStack(null)
1、首先,新建 FragmentTest.java 类继承 fragment
2、创建fragment中的布局 fragment_test.xml
3、创建activity中的布局 activity_main.xml
注意,这里的fragment控件一定要加 android:id="@+id/fragment_test" 不然会报异常
android.view.InflateException: Binary XML file line #13: Binary XML file line #13: Error inflating class fragment
4、创建MainActivity.java
动态加载fragment的静态加载fragment的一、二步相同。从第三步开始。
3、创建activity_main.xml
Framelayout 是一个用来存放 Fragment 的容器
3、创建MainActivity.java类
Fragment中的onCreateView的时候 要求返回一个创建好的视图View,你只需要将你的LinearLayout,定义在这个view中即可
关于Fragment介绍及生命同期:
1、Fragment的产生与介绍
Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。
2、Fragment的生命周期
Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:
可以看到Fragment比Activity多了几个额外的生命周期回调方法:onAttach(Activity)当Fragment与Activity发生关联时调用。onCreateView(LayoutInflater, ViewGroup,Bundle)创建该Fragment的视图onActivityCreated(Bundle)当Activity的onCreate方法返回时调用onDestoryView()与onCreateView想对应,当该Fragment的视图被移除时调用onDetach()与onAttach相对应,当Fragment与Activity关联被取消时调用.
注意:除了onCreateView,其他的所有方法如果你重写了,必须先调用父类的该方法
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)