本文 介绍两点 已是fragment的切换 一是fragment刷新
先说第一点 fragment的切换
目前fragment在开发中应用越来越广泛 当然也非常方便
而我们切换fragment 也有两中方式
第一种是replace的方法进行的 这种方式要看运用场景 用起来很方便 但是个人感觉效果并不好 因为这种方式进行切换得话 首先他会remove掉当前的fragment,然后在new 一个新的fragment进行add,也就是说当前fragment中的所有东西都是重新加载的 所以个人不建议使用这种方式进行fragment的高频率切换 这种只适合fragment切换和使用次数比较少的情况
第二种是show+hide 进行fragment切换 这种方式相比第一种可能会复杂一点 首先要建立几个fragment 开始事务 然后判断添加 举个例子
1 创建fragment……
2 添加事务 androidappFragmentTransaction ft = getFragmentManager()beginTransaction();
–#在添加之前先进行判断隐藏#–
// 这是hide fragment 的方法
onHideFragment(ft);
3 判断添加
if (homeFragment==null){
homeFragment = new HomeFragment();
ftadd(Ridcontent,homeFragment);
}else {
ftshow(homeFragment);
}
4 判断隐藏
if (homeFragment!=null){
fthide(homeFragment);
}
5 添加一个默认显示fragment 也就是你进入activity需要显示的那个
好 此时你就完成了使用hide + show 进行fragment切换了
现在我们说第二点 就是fragment的刷新需求
我们可能会需要fragment的刷新功能 例如说是我首页使用fragment 进行功能切换时 希望返回到之前的fragment可以刷新 或者返回到activity时 fragment也可以刷新 本人使用了 两种方法进行fragment的刷新 我想大部分应该都会使用第一种 返回activity时 fragment刷新 就是重写acvitity的onstart() 方法进行刷新fragment的数据 但是这是有弊端的 第一就是假如你使用了listview或者gridview 时会出现重复加载的情况 所以使用这种方法时 你就要进行清空数据并刷新适配器就可以避免了
第二种 就是使用hide+show时 在fragment进行切换时 刷新fragment 此时会有这样一个这样的方法 onHiddenChanged(boolean hidden);看方法名 你也可以看出来 就是在hide有变化时使用 hidden参数是boolean 当hidden为true时表示fragment在hide 此时不必更新数据 当hidden为false时 他就不隐藏了 此时更新
if (hidden){
return;
}else {
listclear();
getSellList();
}
list是要清空的 避免重复加载
–#onHiddenChanged(boolean hidden); 这是fragment的方法哦 !!!#–
本文 到此结束 希望对各位有所帮助 有问题可以评论区提出 大家一起进步
通常的做法,在onResume中发一起一个异步的请求去拿数据,通过回调,收到返回的数据,然后更新UI。
网络获取数据结束判断数据有更新,然后通过set将控件的数据更新。
举例:
这个是我的一个fragment,我把它放在一个viewpager的fragment中
public class BottomFragmentOne extends BaseFragment {private static final String ARG_CITY = "city";
private String mCity;
private TextView tmpD;
private TextView tmpN;
private SimpleDraweeView imageD;
private SimpleDraweeView imageN;
public static BottomFragmentOne newInstanceOne(String city) {
BottomFragmentOne fragment = new BottomFragmentOne();
Bundle args = new Bundle();
argsputString(ARG_CITY, city);
fragmentsetArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
if (getArguments() != null) {
mCity = getArguments()getString(ARG_CITY);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflaterinflate(Rlayoutbottom_fragment_one, container, false);
tmpD= (TextView) viewfindViewById(Ridtmp_d);
tmpN = (TextView) viewfindViewById(Ridtmp_n);
imageD= (SimpleDraweeView) viewfindViewById(Ridimage_d);
imageN= (SimpleDraweeView) viewfindViewById(Ridimage_n);
setUI();
return view;
}
//用来设置UI,更新UI时重新从数据库获取数据,进行设置
public void setUI(){
Forecast forecast = mFrecastDaogetForecastByCity(mCity);
tmpDsetText(forecastgetDaily_1_max());
tmpNsetText(forecastgetDaily_1_min());
imageDsetImageURI(getImageUri(forecastgetDaily_1_code_d()));
imageNsetImageURI(getImageUri(forecastgetDaily_1_code_n()));
}
}
2除了上面那个,还有一个类似的fragment,我想实按下按钮后,在两个fragment之间进行切换。下面是按钮代码
@Overridepublic void onClick(View v) {
FragmentManager fm = getChildFragmentManager();
// 开启Fragment事务
FragmentTransaction transaction = fmbeginTransaction();
switch (vgetId())
{
case Ridbutton_left:
if (mBottomOne == null)
{
mBottomOne = new BottomFragmentOne()newInstanceOne(mCity);
}// 使用当前Fragment的布局替代id_content的控件
transactionreplace(Ridbottom_weather,mBottomOne);
break;
case Ridbutton_right:
if (mBottomTwo == null)
{
mBottomTwo = new BottomFragmentTwo()newInstanceTwo(mCity);
}
transactionreplace(Ridbottom_weather, mBottomTwo);
break;
}
// 事务提交
transactioncommit();
}
3下面是viewpager中的fragment用来更新上面两个fragment数据的方法。
public void UpdateUI(){mBottomOnesetUI();
mBottomTwosetUI();
}
如果是比较低的版本用的是supportv4兼容包的话
布局中无法使用Fragment标签
最好是在布局里用xml文件写一个framelayout的标签。
写一个子类继承Fragment。
在FragmentActivity中使用Fragment。绑定。添加。移除。。此时要与Framelayout组件的id绑定。
要执行 *** 作此时要得到FragmentManager 并且通过FragmentTransaction来提交事务。
这里就和官方demo上的用法一样了
要注意的是最好不要再别的地方new一个Fragment 。Fragment的生命周期会受到相关Activity的影响。。最好在自己里面定义静态的newInstance方法。
希望能帮助你。
下面,我将解答这两个问题。
答:采用 Bundle 方式。具体Demo步骤如下:
activcity_2_fragmentxml
fragmentxml
Activity2Fragment
mFragmentjava
至此, Activity 传递数据到 Fragment 讲解完毕。
activity_mainxml
fragmentxml
ICallBackjava
mFragmentjava
Main_Activityjava
至此,将数据从 Fragment 发送到 Activity 讲解完毕
不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。
Fragment优点
Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。
Fragment可以轻松得创建动态灵活的UI设计,可以适应于不同的屏幕尺寸。从手机到平板电脑。
Fragment是一个独立的模块,紧紧地与activity绑定在一起。可以运行中动态地移除、加入、交换等。
Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。
Fragment 解决Activity间的切换不流畅,轻量切换。
Fragment 替代TabActivity做导航,性能更好。
Fragment 在42版本中新增嵌套fragment使用方法,能够生成更好的界面效果。
Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragment来代替,只有在需要的时候才加载Fragment,提高性能。
可以从startActivityForResult中接收到返回结果,但是View不能。
反正我是没有看到fragment有什么缺点(可能是我程度没达到),再说它(fragment)就是一个api而已感觉不好就用activity就ok了。
没显示可能是的 listsize() <=0 了,因为你的数据是网络异步加载的,自己也开了线程,这个应该清楚一下,所以一开始你传入的list,size就0了,getItemCount() 这里就 return 0;试下在数据加载完成的时候 (while()之后)调用notifyDataSetChanged();刷新一下
Mark一下吧,在手机上没心思回答。
————————————————————————
倦怠症发作,还是没有Coding的欲望,不过受楼下启发我突然想起一种会被人揍的省事方法,理论上可行,就是给内嵌的PagerView设置属性,setOffscreenPageLimit(0),也就是不预加载,这样每次切换页面都要onCreateView了(注意不是onActivityCreate,这里Activity依旧只Create一次)
其实这属于Fragment间的通信问题吧,正常实现方式挺多的,图省事的话就用EventBus,
笨一点的就弄个静态flag,数据变化时就把flag设为true,然后在有列表的Fragment的onResume周期判断,listView,adapter不为null(重要)且flag为true就notifydatasetchanged,然后再把flag改回false。这习惯不好,会被人鄙视不过能达到目的。
换平时要Fragment间及时交互,我通常会在Fragment的构造方法里传接口实例,通过父Activity分配处理,建议你也用这种方式,邪道方式尝试下可以,用多了养成坏习惯就害了自己了……
以上就是关于android fragment 刷新功能全部的内容,包括:android fragment 刷新功能、android 怎么刷新fragment页面、Android Fragment 如何添加到一个LinearLayout 中还有Fragment到底如何使用越详细越好通俗一点。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)