android tab fragment中fragment的问题

Android实战开发中,当我们使用ViewPager+Fragment的时候肯定知道Fragment会预先加载两侧Fragment的布局,如果有大量数据的话,会造成Fragment卡顿现象,所以这里说明一种Fragment缓加载的方式,相当简单,只要继承以下父类Fragment,再在对应方法中加载数据即可实现Fragment缓加载了,剩下的注释很清楚,如果你还想在缓加载基础上实现下拉刷新等功能,那就更好了。
一、父类BaseFragment
import android.support.v4.app.F
* 基础Fragment,子类Fragment都继承自它,尤其是ViewPager中的Fragment
* 因为ViewPager+Fragment组合使用时会产生预先加载前后Fragment,若再加上比较大的数据量,就会造成卡顿的现象,
* 为防止发生,可以在用户可见的时候加载数据,因此才会写一个BaseFragment
public class BaseFragment extends Fragment{
* 当前界面是否呈现给用户的状态标志
protected boolean isV
* 重写Fragment父类生命周期方法,在onCreate之前调用该方法,实现Fragment数据的缓加载.
* @param isVisibleToUser 当前是否已将界面显示给用户的状态
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
isVisible =
onVisible();
isVisible =
onInvisible();
* 当界面呈现给用户,即设置可见时执行,进行加载数据的方法
* 在用户可见时加载数据,而不在用户不可见的时候加载数据,是为了防止控件对象出现空指针异常
protected void onVisible(){
setlazyLoad();
* 当界面还没呈现给用户,即设置不可见时执行
protected void onInvisible(){
* 加载数据方法
protected void setlazyLoad(){
二、子类DemoPreloadFragment
import android.os.B
import android.view.LayoutI
import android.view.V
import android.view.ViewG
* 预加载Fragment例子
public class DemoPreloadFragment extends BaseFragment{
* 预加载标志,默认值为false,设置为true,表示已经预加载完成,可以加载数据
private boolean isP
* Fragment生命周期方法,此view可改为自定义的布局
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(android.R.layout.activity_list_item, container, false);
//TODO 此处初始化view中各个控件
isPrepared =
setlazyLoad();
* 加载数据的方法,只要保证isPrepared和isVisible都为true的时候才往下执行开始加载数据
protected void setlazyLoad() {
super.setlazyLoad();
if(!isPrepared || !isVisible) {
//TODO 此处填充view中各个控件的数据
本博客所有文章如无特别注明均为原创。作者: ,复制或转载请以超链接形式注明转自
。原文地址《》。如果此文侵犯了原作者的权益可予以删除。
岂能尽如人意,但求无愧我心。
如果觉得该作者的文章对你有帮助,请随意打赏给他。您的支持将鼓励作者继续创作!
打赏本文作者方式
用微信扫一扫可留言
(若二维码有误可)
需要登录才能进入会员中心多个Fragment切换时如果直接使用replace()方法来切换Fragment的内容,会导致要切换的Fragment重新实例化,也就是会重新调用onCreateView()方法,之前也想过用show()和hide()方法来显示和隐藏Fragment,当然用下来就会发现如果存在多个Fragment时还是会有一些别的问题,之后查了很多网上的答案,发现很多大神用了一个方法来切换Fragment,在这里就不添上N个大神的原文地址了,本人也不知道谁才是第一个作者,在此感谢各位大神。
以下是切换的方法:
* 切换Fragment
* @param fromFragment:需要隐藏的Fragment
* @param toFragment:需要显示的Fragment
private void switchFragment(Fragment fromFragment, Fragment toFragment) {
if (fromFragment != toFragment) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (!toFragment.isAdded()) {
fragmentTransaction.hide(fromFragment).add(R.id.framelayout_content_activity_home, toFragment).commit();
fragmentTransaction.hide(fromFragment).show(toFragment).commit();
顺便说下add()和replace()的区别:
前者是把一个Fragment添加到一个容器里,后者是先移除掉相同ID的所有Fragment,然后在add()当前的这个Fragment,一个有2层,一个有1层。
多个Fragment切换时,如果是随意可以点击来切换的,会判断不清楚需要隐藏的Fragment是哪个,大家可以使用SharedPreferences来给每次点击存储一个值,然后通过判断这个值来判断是从哪个地方点击的,例如这样:
if&(pos ==1) {
switchFragment(B,&A);
}&else if&(pos ==2)
switchFragment(C,&A);
本文已收录于以下专栏:
相关文章推荐
问题众所周知我们在开发中常常会使用ViewPager和Fragment的组合,但是使用这样的组合页面在滑动的时候会有一些问题,比如从第一页滑动到第四页,在从第四页滑动到第一页,这个时候第一页的frag...
本文借鉴自:/p/d
至于fragment的使用就不多说了,直奔主题,
布局文件:&LinearLayout xmlns:...
Linux老难题解决了!
Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU、内存资源等的真正分布,具体的工作机制,这使得他们对很多问题的分析都摸不到方向。比如进程的调度延时是多少?linux能否硬实时?多核下多线程如何执行?
原文地址:破晓博客 » [原创]FragmentTab切换Fragment时避免重复加载UI
使用FragmentTa时,Fragment之间切换时每次都会调用onCreateView方法,导致每...
在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment
但是,这样会有一个问题 ,应该很多朋友都遇到过:
每次切换的时候,Fragment都会重新实例化,也就是...
最近项目中用到多图选择上传的需求,随后百度了一下用了别人写的demo,发现在很多机型上各种不适,闪退等问题,严复影响使用,后面我自己写了一个,公司20几款手机全部通过,在腾讯云测中也使用了4,50款手...
现在市面上很多手机应用都会有一个非常类似的功能,就是屏幕下方有一行Tab标签选项,点击不同的标签就可以切换到不同的界面:
这个在以前是用ActivityGroup(年代太久远了,那时候俺还木有毕业...
如何避免fragment重复加载
开发的时候,有时候Fragment的切换,是不需要对原先的Fragment进行重新加载的。而Fragment的界面是既可以进行重新加载,也可以不进行重新加载。
每次重新加载的话,我们是使用的repl...
下面记录下我自己根据面文章制作的demo的csdn的下载地址[http://download.csdn.net/detail/android_zhengyongbo/9852419]
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Android开发中,Fragment真的有大家说的那么不堪吗? - 知乎387被浏览18063分享邀请回答5212 条评论分享收藏感谢收起63 条评论分享收藏感谢收起查看更多回答1 个回答被折叠()249735人阅读
【Android 源码解析】(30)
【android 进阶之路】(74)
转载请标明出处:上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:。本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragment创建对话框,如何与ActionBar,MenuItem集成等~~1、管理Fragment回退栈类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。看这样一个效果图:点击第一个按钮,切换到第二个界面,点击第二个按钮,切换到第三个界面,然后点击Back键依次回退。这像不像初学Android时的Activity跳转,当然了,这里肯定不是,不然我就跪了。这里是Fragment实现的,用户点击Back,实际是Fragment回退栈不断的弹栈。如何添加一个Fragment事务到回退栈:FragmentTransaction.addToBackStack(String)下面讲解代码:很明显一共是3个Fragment和一个Activity.先看Activity的布局文件:&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent& &
&FrameLayout
android:id=&@+id/id_content&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent& &
&/FrameLayout&
&/RelativeLayout&不同的Fragment就在这个FrameLayout中显示。MainActivity.javapackage com.zhy.zhy_
import android.app.A
import android.app.FragmentM
import android.app.FragmentT
import android.os.B
import android.view.W
public class MainActivity extends Activity
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, new FragmentOne(),&ONE&);
tx.commit();
很简单,直接将FragmentOne添加到布局文件中的FrameLayout中,注意这里并没有调用FragmentTransaction.addToBackStack(String),因为我不喜欢在当前显示时,点击Back键出现白板。而是正确的相应Back键,即退出我们的Activity.下面是FragmentOnepackage com.zhy.zhy_
import android.app.F
import android.app.FragmentM
import android.app.FragmentT
import android.os.B
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.view.ViewG
import android.widget.B
public class FragmentOne extends Fragment implements OnClickListener
private Button mB
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_one, container, false);
mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);
mBtn.setOnClickListener(this);
public void onClick(View v)
FragmentTwo fTwo = new FragmentTwo();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.replace(R.id.id_content, fTwo, &TWO&);
tx.addToBackStack(null);
tx.commit();
我们在点击FragmentOne中的按钮时,使用了replace方法,如果你看了前一篇博客,一定记得replace是remove和add的合体,并且如果不添加事务到回退栈,前一个Fragment实例会被销毁。这里很明显,我们调用tx.addToBackStack(null);将当前的事务添加到了回退栈,所以FragmentOne实例不会被销毁,但是视图层次依然会被销毁,即会调用onDestoryView和onCreateView,证据就是:仔细看上面的效果图,我们在跳转前在文本框输入的内容,在用户Back得到第一个界面的时候不见了。接下来FragmentTwopackage com.zhy.zhy_
import android.app.F
import android.app.FragmentM
import android.app.FragmentT
import android.os.B
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.view.ViewG
import android.widget.B
public class FragmentTwo extends Fragment implements OnClickListener
private Button mB
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_two, container, false);
mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);
mBtn.setOnClickListener(this);
public void onClick(View v)
FragmentThree fThree = new FragmentThree();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.hide(this);
tx.add(R.id.id_content , fThree, &THREE&);
tx.replace(R.id.id_content, fThree, &THREE&);
tx.addToBackStack(null);
tx.commit();
这里点击时,我们没有使用replace,而是先隐藏了当前的Fragment,然后添加了FragmentThree的实例,最后将事务添加到回退栈。这样做的目的是为了给大家提供一种方案:如果不希望视图重绘该怎么做,请再次仔细看效果图,我们在FragmentTwo的EditText填写的内容,用户Back回来时,数据还在~~~最后FragmentThree就是简单的Toast了:package com.zhy.zhy_
import android.app.F
import android.os.B
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.view.ViewG
import android.widget.B
import android.widget.T
public class FragmentThree extends Fragment implements OnClickListener
private Button mB
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_three, container, false);
mBtn = (Button) view.findViewById(R.id.id_fragment_three_btn);
mBtn.setOnClickListener(this);
public void onClick(View v)
Toast.makeText(getActivity(), & i am a btn in Fragment three&,
Toast.LENGTH_SHORT).show();
好了,经过上面的介绍,应该已经知道Fragment回退栈是怎么一回事了,以及hide,replace等各自的应用的场景。这里极其注意一点:上面的整体代码不具有任何参考价值,纯粹为了显示回退栈,在后面讲解了Fragment与Activity通信以后,会重构上面的代码!2、Fragment与Activity通信因为所有的Fragment都是依附于Activity的,所以通信起来并不复杂,大概归纳为:a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。3、Fragment与Activity通信的最佳实践因为要考虑Fragment的重复使用,所以必须降低Fragment与Activity的耦合,而且Fragment更不应该直接操作别的Fragment,毕竟Fragment操作应该由它的管理者Activity来决定。下面我通过两种方式的代码,分别重构,FragmentOne和FragmentTwo的点击事件,以及Activity对点击事件的响应:首先看FragmentOnepackage com.zhy.zhy_
import android.app.F
import android.os.B
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.view.ViewG
import android.widget.B
public class FragmentOne extends Fragment implements OnClickListener
private Button mB
* 设置按钮点击的回调
* @author zhy
public interface FOneBtnClickListener
void onFOneBtnClick();
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_one, container, false);
mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);
mBtn.setOnClickListener(this);
* 交给宿主Activity处理,如果它希望处理
public void onClick(View v)
if (getActivity() instanceof FOneBtnClickListener)
((FOneBtnClickListener) getActivity()).onFOneBtnClick();
可以看到现在的FragmentOne不和任何Activity耦合,任何Activity都可以使用;并且我们声明了一个接口,来回调其点击事件,想要管理其点击事件的Activity实现此接口就即可。可以看到我们在onClick中首先判断了当前绑定的Activity是否实现了该接口,如果实现了则调用。再看FragmentTwopackage com.zhy.zhy_
import android.app.F
import android.os.B
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.view.ViewG
import android.widget.B
public class FragmentTwo extends Fragment implements OnClickListener
private Button mB
private FTwoBtnClickListener fTwoBtnClickL
public interface FTwoBtnClickListener
void onFTwoBtnClick();
//设置回调接口
public void setfTwoBtnClickListener(FTwoBtnClickListener fTwoBtnClickListener)
this.fTwoBtnClickListener = fTwoBtnClickL
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_two, container, false);
mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);
mBtn.setOnClickListener(this);
public void onClick(View v)
if(fTwoBtnClickListener != null)
fTwoBtnClickListener.onFTwoBtnClick();
与FragmentOne极其类似,但是我们提供了setListener这样的方法,意味着Activity不仅需要实现该接口,还必须显示调用mFTwo.setfTwoBtnClickListener(this)。最后看Activity :package com.zhy.zhy_
import android.app.A
import android.app.FragmentM
import android.app.FragmentT
import android.os.B
import android.view.W
import com.zhy.zhy_fragments.FragmentOne.FOneBtnClickL
import com.zhy.zhy_fragments.FragmentTwo.FTwoBtnClickL
public class MainActivity extends Activity implements FOneBtnClickListener,
FTwoBtnClickListener
private FragmentOne mFO
private FragmentTwo mFT
private FragmentThree mFT
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mFOne = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, mFOne, &ONE&);
tx.commit();
* FragmentOne 按钮点击时的回调
public void onFOneBtnClick()
if (mFTwo == null)
mFTwo = new FragmentTwo();
mFTwo.setfTwoBtnClickListener(this);
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.replace(R.id.id_content, mFTwo, &TWO&);
tx.addToBackStack(null);
tx.commit();
* FragmentTwo 按钮点击时的回调
public void onFTwoBtnClick()
if (mFThree == null)
mFThree = new FragmentThree();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.hide(mFTwo);
tx.add(R.id.id_content, mFThree, &THREE&);
// tx.replace(R.id.id_content, fThree, &THREE&);
tx.addToBackStack(null);
tx.commit();
代码重构结束,与开始的效果一模一样。上面两种通信方式都是值得推荐的,随便选择一种自己喜欢的。这里再提一下:虽然Fragment和Activity可以通过getActivity与findFragmentByTag或者findFragmentById,进行任何操作,甚至在Fragment里面操作另外的Fragment,但是没有特殊理由是绝对不提倡的。Activity担任的是Fragment间类似总线一样的角色,应当由它决定Fragment如何操作。另外虽然Fragment不能响应Intent打开,但是Activity可以,Activity可以接收Intent,然后根据参数判断显示哪个Fragment。4、如何处理运行时配置发生变化运行时配置发生变化,最常见的就是屏幕发生旋转,如果你不知道如何处理屏幕变化可以参考:这里提一下:很多人觉得强制设置屏幕的方向就可以了,但是有一点,当你的应用被至于后台(例如用户点击了home),长时间没有返回的时候,你的应用也会被重新启动。比如上例:如果你把上面的例子你至于FragmentThree界面,然后处于后台状态,长时间后你会发现当你再次通过home打开时,上面FragmentThree与FragmentOne叠加在一起,这就是因为你的Activity重新启动,在原来的FragmentThree上又绘制了一个FragmentOne。好了,下面看一段代码:Activity:package com.zhy.zhy_
import android.app.A
import android.app.FragmentM
import android.app.FragmentT
import android.os.B
import android.view.W
public class MainActivity extends Activity
private FragmentOne mFO
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mFOne = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, mFOne, &ONE&);
tx.commit();
Fragmentpackage com.zhy.zhy_
import android.app.F
import android.os.B
import android.util.L
import android.view.LayoutI
import android.view.V
import android.view.ViewG
public class FragmentOne extends Fragment
private static final String TAG = &FragmentOne&;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
Log.e(TAG, &onCreateView&);
View view = inflater.inflate(R.layout.fragment_one, container, false);
public void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.e(TAG, &onCreate&);
public void onDestroyView()
// TODO Auto-generated method stub
super.onDestroyView();
Log.e(TAG, &onDestroyView&);
public void onDestroy()
// TODO Auto-generated method stub
super.onDestroy();
Log.e(TAG, &onDestroy&);
很简单的代码,当你运行之后,不断的旋转屏幕,你会发现每旋转一次屏幕,屏幕上就多了一个FragmentOne的实例,并且后台log会打印出许多套生命周期的回调。类似:07-20 08:18:46.651: E/FragmentOne(1633): onCreate
07-20 08:18:46.651: E/FragmentOne(1633): onCreate
07-20 08:18:46.651: E/FragmentOne(1633): onCreate
07-20 08:18:46.681: E/FragmentOne(1633): onCreateView
07-20 08:18:46.831: E/FragmentOne(1633): onCreateView
07-20 08:18:46.891: E/FragmentOne(1633): onCreateView
这是为什么呢,因为当屏幕发生旋转,Activity发生重新启动,默认的Activity中的Fragment也会跟着Activity重新创建;这样造成当旋转的时候,本身存在的Fragment会重新启动,然后当执行Activity的onCreate时,又会再次实例化一个新的Fragment,这就是出现的原因。那么如何解决呢:其实通过检查onCreate的参数Bundle savedInstanceState就可以判断,当前是否发生Activity的重新创建:默认的savedInstanceState会存储一些数据,包括Fragment的实例:通过打印可以看出:07-20 08:23:12.952: E/FragmentOne(1782): Bundle[{android:fragments=android.app.FragmentManagerState@40d0b7b8, android:viewHierarchyState=Bundle[{android:focusedViewId=, android:views=android.util.SparseArray@40d0af68}]}]
所以,我们简单改一下代码,只有在savedInstanceState==null时,才进行创建Fragment实例:package com.zhy.zhy_
import android.app.A
import android.app.FragmentM
import android.app.FragmentT
import android.os.B
import android.util.L
import android.view.W
public class MainActivity extends Activity
private static final String TAG = &FragmentOne&;
private FragmentOne mFO
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Log.e(TAG, savedInstanceState+&&);
if(savedInstanceState == null)
mFOne = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, mFOne, &ONE&);
tx.commit();
现在无论进行多次旋转都只会有一个Fragment实例在Activity中。现在还存在一个问题,就是重新绘制时,Fragment发生重建,原本的数据如何保持?其实和Activity类似,Fragment也有onSaveInstanceState的方法,在此方法中进行保存数据,然后在onCreate或者onCreateView或者onActivityCreated进行恢复都可以。由于篇幅原因,就不贴测试代码了。5、Fragmeny与ActionBar和MenuItem集成Fragment可以添加自己的MenuItem到Activity的ActionBar或者可选菜单中。a、在Fragment的onCreate中调用 setHasOptionsMenu(true);b、然后在Fragment子类中实现onCreateOptionsMenuc、如果希望在Fragment中处理MenuItem的点击,也可以实现onOptionsItemSelected;当然了Activity也可以直接处理该MenuItem的点击事件。代码:Fragmentpackage com.zhy.zhy_
import android.app.F
import android.os.B
import android.view.LayoutI
import android.view.M
import android.view.MenuI
import android.view.MenuI
import android.view.V
import android.view.ViewG
import android.widget.T
public class FragmentOne extends Fragment
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_one, container, false);
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
inflater.inflate(R.menu.fragment_menu, menu);
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case R.id.id_menu_fra_test:
Toast.makeText(getActivity(), &FragmentMenuItem1&, Toast.LENGTH_SHORT).show();
Activitypackage com.zhy.zhy_
import android.app.A
import android.app.FragmentM
import android.app.FragmentT
import android.os.B
import android.util.L
import android.view.M
import android.view.MenuI
import android.view.W
import android.widget.T
public class MainActivity extends Activity
private static final String TAG = &FragmentOne&;
private FragmentOne mFO
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Log.e(TAG, savedInstanceState + &&);
if (savedInstanceState == null)
mFOne = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, mFOne, &ONE&);
tx.commit();
public boolean onCreateOptionsMenu(Menu menu)
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.main, menu);
public boolean onOptionsItemSelected(MenuItem item)
switch (item.getItemId())
case R.id.action_settings:
Toast.makeText(this, &setting&, Toast.LENGTH_SHORT).show();
//如果希望Fragment自己处理MenuItem点击事件,一定不要忘了调用super.xxx
return super.onOptionsItemSelected(item);
效果图:好了,可以很好的看到,Fragment可以添加MenuItem,也可以自己处理点击~~~6、没有布局的Fragment的作用没有布局文件Fragment实际上是为了保存,当Activity重启时,保存大量数据准备的请参考博客:7、使用Fragment创建对话框这是Google推荐的方式,我也单独写过博客介绍,请参考:好了,终于把Fragment相关的联系到一起了,上述基本包含了Fragment所有的用法~~~相信大家如果能够看完,一定有不少的收获~~~有任何问题,欢迎留言~~~两篇结束,相信你对Fragment已经有了一定的了解,那么在项目中的最佳实践是什么呢?请移步:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
积分:49766
积分:49766
排名:第62名
原创:202篇
评论:15049条
长期为您推荐优秀博文、开源项目、视频等,进入还有好玩的等着你,欢迎扫一扫。
请勿重复加群,Thx
文章:11篇
阅读:218416
文章:10篇
阅读:125801
文章:67篇
阅读:6173155

我要回帖

更多关于 android中的fragment 的文章

 

随机推荐