android的fragment使用
‘壹’ android fragment 刷新功能
本文 介绍两点 已是fragment的切换 一是fragment刷新
先说第一点 fragment的切换
目前fragment在开发中应用越来越广泛 当然也非常方便
而我们切换fragment 也有两中方式
第一种是replace的方法进行的 这种方式要看运用场景 用起来很方便 但是个人感觉效果并不好 因为这种方式进行切换得话 首先他会remove掉当前的fragment,然后在new 一个新的fragment进行add,也就是说当前fragment中的所有东西都是重新加载的 所以个人不建议使用这种方式进行fragment的高频率切换 这种只适合fragment切换和使用次数比较少的情况
第二种是show+hide 进行fragment切换 这种方式相比第一种可能会复杂一点 首先要建立几个fragment 开始事务 然后判断添加 举个例子
1 创建fragment……
2 添加事务 android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
–#在添加之前先进行判断隐藏#–
// 这是hide fragment 的方法
onHideFragment(ft);
3 判断添加
if (homeFragment==null){
homeFragment = new HomeFragment();
ft.add(R.id.content,homeFragment);
}else {
ft.show(homeFragment);
}
4 判断隐藏
if (homeFragment!=null){
ft.hide(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 {
list.clear();
getSellList();
}
list是要清空的 避免重复加载
–#onHiddenChanged(boolean hidden); 这是fragment的方法哦 !!!#–
本文 到此结束 希望对各位有所帮助 有问题可以评论区提出 大家一起进步
‘贰’ Android使用fragment实现底部导航栏切换界面
源码链接
效果图
创建bottom_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="36dp"
android:layout_height="36dp"
android:id="@+id/bottom_icon"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#565656"
android:textSize="10sp"
android:id="@+id/bottom_text" />
public void setNormalImage(int normalIcon){
this.normalIcon = normalIcon;
ivIcon.setImageResource(normalIcon);
}
public void setFocusedImage(int focusedIcon){
this.focusedIcon = focusedIcon;
}
public void setTvText(String text){
tvText.setText(text);
}
public void setFocused(boolean isFocused){
this.isFocused = isFocused;
if(isFocused){
ivIcon.setImageResource(focusedIcon);
tvText.setTextColor(Color.parseColor("#02b5bc"));
}else{
ivIcon.setImageResource(normalIcon);
tvText.setTextColor(Color.BLACK);
}
}
<FrameLayout
android:id="@+id/frameLayout_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="11"
>
</FrameLayout>
四个如下
<com.example.qiaolulu.qiaofragment.BottomLayout
android:id="@+id/square"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
</com.example.qiaolulu.qiaofragment.BottomLayout>
public class Babyextends Fragment{
@Nullable
@Override
public ViewonCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//加载你设计要显示的界面
View view = inflater.inflate(R.layout.baby,null);
return view;
}
}
fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction =fragmentManager.beginTransaction();
firstPage =new FirstPage();
transaction.add(R.id.frameLayout_container,firstPage);
transaction.commit();
‘叁’ android fragment 怎么使用
fragment主要是依赖于activity,所以可以在主界面,新建一个framelayout,用来替换fragment的布局,主要是使用framgentmanager来管理切换fragment,网上有很多很好的例子.
‘肆’ Android——Fragment
Fragment必须总是被嵌入到一个activity之中,并且fragment的生命周期直接接受其宿主activity的生命周期的影响。你可以认为fragment是activity的一个模块零件,它有自己的生命周期,接收它自己的输入的事件,并且可以在activity运行时添加或者删除。
应该将每一个fragment设计为模块化和可复用化的activity组件。也就是说,你可以在多个activity中引用同一个fragment,因为fragment定义了它自己的布局,并且使用它本身生命周期回调的行为。
Fragment比Activity多了几个额外的生命周期回调方法:
管理fragment生命周期与管理activity生命周期很相像,像activity一样,fragment也有三种状态:
1、Resumed:
fragment在运行中的activity中可见。
2、Paused:
另一个activity处于前台且得到焦点,但是这个fragment所在的activtiy仍然可见(前台activity部分透明,或者没有覆盖全屏)。
3、Stopped:
fragment不可见。要么宿主activity已经停止,要么fragment已经从activity上移除,但已被添加到后台栈中。一个停止的fragment仍然活着(所有的状态和成员信息仍然由系统保留着)。但是,它对于用户来讲已经不再可见,并且如果activity被杀掉,它也将被杀掉。
如果activity的进程被杀掉了,在activity被重新创建时,你恢复fragment状态。可以执行fragment的onSaveIntanceState()来保存状态(注意:fragment是在onCreate(),onCreateView()或者onActivityCreate()中进行恢复)。
在生命周期方面,activity和fragment之间一个很重要的不同就是在各自的后台栈中是如何存储的。当activity停止时,默认情况下activity被安置在由系统管理的activity后台栈中;fragment仅当在一个事务被移除时,通过显式调用addToBackStack()请求保存的实例,该fragment才被置于由宿主activity管理的后台栈。
类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。
如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。
通过Arguments创建Fragment,不建议通过为Fragment添加带参数的构造函数
1、FragmentPagerAdapter:对于不再需要的fragment,选择调用detach方法,仅销毁视图,并不会销毁fragment实例。
2、FragmentStatePagerAdapter:会销毁不再需要的fragment,当当前事务提交以后,会彻底的将fragment从当前Activity的FragmentManager中移除。
3、懒加载,核心方法是 setUserVisibleHint()
原因1:横竖屏切换,造成Fragment重新实例化。
原因2:按下Home键,Activity处于后台,由于内存不足被销毁,重新唤醒时Fragment重新实例化。
注:出现的原因是在 API24 之前的 v4包 的源码问题,
解决方案:通过检查onCreate的参数Bundle savedInstanceState就可以判断,当前是否发生Activity的重新创建:
默认的savedInstanceState会存储一些数据,只有在savedInstanceState==null时,才进行创建Fragment实例:
‘伍’ android 怎么使用fragment里面的控件
一、第一种方法:
(1)Fragment的第一种使用方法是使用fragment加载单独的布局文件:(也就是xml的方式实现
)activity_main.xml主要是在一个线性布局中添加两个线性布局
< "http://www.codingke.com" target="_blank"
class="keylink">vcD4KPHA+PHByZSBjbGFzcz0="brush:java;">
right.xml是等会使用fragment的时候,加载的一个布局文件:(由于主要是在界面中加载、所以不作特殊要求)
MyFragment.java就是加载fragment的类,要继承Fragment类:(要重载父类的下边三个方法)
二、第二种方法
项目结构和上图中的差不多:只是在布局文件中,直接使用fragment控件。
在myfragment.java文件中,只需找到fragment所容纳的布局文件即可,不进行业务上的操作。
MainActivity.java文件:进行fragment的业务处理,想了解更多请关注扣丁学堂。
‘陆’ Android组件之Fragment(一)---基础知识与运用
Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段!想想,如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,他也会跟着销毁!
引用官方的一张图片,其实已经说明问题了,就是为了更好的适配大屏,在大屏的时候,不需要去在一个activity内部通过复杂的布局和界面去实现,只需要去在一个activity内部,通过多个fragment来做界面布局实现即可,而且针对于多个fragment来说, 每个fragment有单独的生命周期,
Demo样例,我们在一个界面中,有上下两个fragment,如图所示:
Step 2: Fragment创建,视图加载,数据赋值
BlankFragment .java
Step 3: Activity在onCreate( )方法中调用setContentView()之后调用FragmentTransaction 进行事务提交
FragmentTestActivity.java
在xml中声明两个fragment,指定为具体的fragment
Step 1:定义Fragment的布局,就是fragment显示内容的
Step 2:自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象
BlankFragment.java
Step 3:在需要加载Fragment的Activity对应的布局文件中添加fragment的标签, 记住,name属性是全限定类名哦,就是要包含Fragment的包名,如:
Step 4: Activity在onCreate( )方法中调用setContentView()加载布局文件即可!
针对在一个Activity中的某个Layout中切换Fragment,,无非两种方法:
我们自己看一下方法注释
源码方法注释里面说的很明白,这个方法会移除所有的fragment,然后添加当前的fragment。
这时分为两种情况,一种是fragment已有并且在前台展示,一种是未有或者在后台,针对于前者,此时replace,生命周期不会发生变化,针对后者,生命周期会重新走
分为两种情况,一种fragment已存在,一种未存在,针对于前者,生命周期无变化,但是会回调onHiddenChanged方法,针对于后者,生命周期会创建一次。
1.Fragment是Google官方引入的一个为了适配大屏、多页面的一个组件。您可以理解为它就是一个类而已,只不过里面包含了View,并且与activity的生命周期进行了关联。
2.动态加载与静态加载相对来说,建议使用动态加载,静态加载固定在了xml文件中,永远不变。
3.replace的fragment如果不在前台,会执行所有生命周期,反之不会执行任何生命周期方法;hide+show生命周期并不会发生变化,但是会回调onHiddenChanged方法,在实际开发中,建议add之后,使用hide+show来操作fragment,一方面减少资源的重复加载和创建,另外一方面提升用户体验感。
4.fragment的生命周期大体上和activity一致,但是前期和后期多了一些东西,因为fragment内部有view,那么这个view需要进行创建、然后添加到activity内部,所以相应的在onCreate与onStart之间就多了几个方法-onCreateView、onViewCreated。相同的道理,fragment的view与activity解绑,也相应的在onStop与onDestory之间多个方法-onDestroyView。onAttach与onDetach可以理解为视图与activity产生关联和接触关联,是最开始和最后的步骤。
Demo地址
‘柒’ Android Fragment的布局中使用android:onClick 属性时需要注意的问题
下面是一个在fragment的布局中定义的一个点击事件
按照常规操作,我们需要在宿主中定义一个名为 onMessageViewClick 的public 方法
这样看起来没什么问题,但是跑起来直接报错:
在持有fragment的activity中定义改方法即可
1.报错信息:无法在对应的context中找到名为 onMessageViewClick 的方法(其实这里已经说的很明白了,找不到方法,在view的context中)
那看一下当我们点击view的时候系统是怎么寻找对应的方法的:
直接上截图,下面是view类中的一个内部类
看一下属性就明白这个类似干什么的了(膜拜)
mHostView:定义了onClick属性的view
mMethodName:方法名称
mResolvedContext:反射对象
mResolvedMethod:反射方法
所以view是通过反射的方式来调用方法的(大家应该不看源码都知道的),这里的mResolvedContext 是通过View.getContext获取的
那么,view的context中为什么找不到方法呀,我都定义了不是吗。但是,注意一下,我们定义的方法是在Fragment中,fragment,fragment是context吗?当然不是,看看fragment class的定义
‘捌’ Android回顾--(十七) Fragment的使用与必踩之坑
碎片,抽象的理解就是一个控件,只是这个控件内部维护了自身的生命周期。Fragment是依赖于Activity,用于显示页面的一部分内容。
这里有的人就会提出疑问了,Android中其他的控件也能在页面显示一部分的内容,为什么还要引入Fragment?
像控件一样,在XML文件里面声明控件 然后控件就显示出来了
Fragment中的控件的事件的处理:
注意:replace()实际是先清除容器里面的Fragment,调用remove方法,然后再执行添加当前的Fragment,add()方法。如果我们每一次都用replace()的话,那么会造成一个问题,就是每一次都会先将前一个先删除,后面一个才能添加上。 造成每一个都需要重新CreatView()那么这么做的话,如果连续不断的去切换的话就会造成卡顿现象,为了解决这个问题就引出了一个概念就是Fragment的优化
注意事项:当我们添加进一个Fragment后,然后再向这个container中添加哪个Fragment的话,那么前一个Fragment没有被杀掉,只是没有显示而已
将当前Fragment的界面显示至帧布局中
我们一般是在onActivityCreateed()方法中处理一些事务。在使用过程中我们要注意一下几点、:
使用工厂类
栈的存储模式:先进后出
Activity也有自己的回退栈
事务:指的是一系列指令的合集,这一系列的指令要么全部执行,要么都不执行
这个地方的id是ft.commit()的返回值,不是Fragment得id
‘玖’ 说说什么是 Android 的碎片(Fragment)
碎片(Fragment),是一种可以嵌入活动当中的 UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因此在平板上应用广泛。
假设我们正在开发一个新闻应用,其中一个界面使用 RecyclerView 展示一组新闻标题,当点击了其中一个标题时,就打开了另一个界面用于显示新闻的详细内容。
若是在手机中设计,我们可以将新闻标题列表放在一个活动中,而将新闻的详细内容放在另一个活动中:
这样的设计方案放在平板上,那么新闻标题将会被拉长直至填充满整个平板的屏幕,而新闻的标题一般都不会太长,所以这样就会导致界面上存在大量的空白区域:
因此,更好的设计方案是将新闻标题列表界面和新闻详细内容界面分别放在两个碎片中,然后在同一个活动里引入这两个碎片,这样就可以充分利用平板的屏幕空间咯O(∩_∩)O~