android中的fragment
来源:互联网 发布:清朗网络海报 编辑:程序博客网 时间:2024/06/07 02:04
在android 3.0的时候,google推出了fragment,深受大家的喜爱。究其原因,是因为fragment极大部分解决了android中的碎片化问题,它使得android的屏幕适配更简单。那么,fragment到底有和魅力呢?下面就让我们一起来看看吧。
fragment的生命周期:
fragment作为对activity的补充,其生命周期与activity的生命周期很类似。换句话说,fragment的生命周期是受所属的activity的生命周期的管理的,但是对于fragment自身而言,它也有属于自己的生命周期。
仔细观察上面的表格就会发现,其实fragment的生命周期和activity的生命周期很类似,甚至可以说大部分的都完全一致,仅仅只是在onCreate和onDestroy有些区别,在fragment中多了几个方法。那么这些方法主要是实现什么功能的呢?
其实多的这几个方法都是成对出现的:
onAttach():activity与fragment关联时调用
onDetach():activity与fragment取消关联时调用
onCreateView():添加fragment的视图
onDestroyView():移除fragment的视图
onActivityCreated():当activity的onCreate方法返回时调用
了解了fragment的这些基本信息,下面我们就一起来使用fragment吧。在使用fragment的时候,我们有两种方法来对fragment进行添加:即静态添加和动态添加
1》静态添加
静态添加:把fragment当做普通的组件直接在xml文件中进行声明,这是最简单最直接使用fragment的方式
04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onAttach------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onCreate------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onCreateView------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onCreate----->MainActivity04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onActivityCreated------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onStart------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onStart----->MainActivity04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onResume----->MainActivity04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onResume------>TestFragment从上面打印的生命周期我们可以知道,首先执行activity所属的fragment的onAttach-->onCreate-->onCreateView,然后再执行activity的onCreate方法等等。
当从fragment跳转到新的activity的时候,会执行:
04-13 10:15:00.240 1347-1347/com.juwang.androidactivity I/MainActivity: onPause------>TestFragment04-13 10:15:00.240 1347-1347/com.juwang.androidactivity I/MainActivity: onPause----->MainActivity04-13 10:15:00.670 1347-1347/com.juwang.androidactivity I/MainActivity: onStop------>TestFragment04-13 10:15:00.670 1347-1347/com.juwang.androidactivity I/MainActivity: onStop----->MainActivity
回退到原来的activity:
04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onRestart----->MainActivity04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onStart------>TestFragment04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onStart----->MainActivity04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onResume----->MainActivity04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onResume------>TestFragment
退出应用:
04-13 10:17:28.530 1347-1347/com.juwang.androidactivity I/MainActivity: onPause------>TestFragment04-13 10:17:28.530 1347-1347/com.juwang.androidactivity I/MainActivity: onPause----->MainActivity04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onStop------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onStop----->MainActivity04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDestroyView------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDestroy------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDetach------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDestroy----->MainActivity
从上面打印的生命周期我们可以总结出以下几点:
(1)fragment的生命周期受其所属的activity的生命周期的影响,即当activity被销毁的时候,对应的fragment也被销毁。
(2)fragment有其自己独立的一套生命周期
(3)除了在创建和销毁的时候fragment的生命周期会有所不同外,其他时候的生命周期和activity基本一致。
(4)fragment中实例和视图并不是共生共灭的。
2》动态添加
动态添加:以代码的形式动态管理fragment的添加移除等。
打开fragment的时候执行的方法:
10-17 08:34:13.446 26756-26756/com.zhoufan.fragmentdemo I/ZF: onCreate ---> MainActivity10-17 08:34:13.448 26756-26756/com.zhoufan.fragmentdemo I/ZF: onStart ---> FragmentOne10-17 08:34:13.448 26756-26756/com.zhoufan.fragmentdemo I/ZF: onCreate ---> FragmentOne10-17 08:34:13.448 26756-26756/com.zhoufan.fragmentdemo I/ZF: onCreateView ---> FragmentOne10-17 08:34:13.450 26756-26756/com.zhoufan.fragmentdemo I/ZF: onActivityCreated ---> FragmentOne10-17 08:34:13.451 26756-26756/com.zhoufan.fragmentdemo I/ZF: onStart ---> FragmentOne10-17 08:34:13.451 26756-26756/com.zhoufan.fragmentdemo I/ZF: onStart ---> MainActivity10-17 08:34:13.457 26756-26756/com.zhoufan.fragmentdemo I/ZF: onResume ---> MainActivity10-17 08:34:13.457 26756-26756/com.zhoufan.fragmentdemo I/ZF: onResume ---> FragmentOne
当从fragment跳转到新的activity的时候,会执行:
10-17 08:47:55.568 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> FragmentOne10-17 08:47:55.568 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> MainActivity10-17 08:47:56.227 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> FragmentOne10-17 08:47:56.227 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> MainActivity
回退到原来的activity:
10-17 08:48:49.801 7803-7803/com.zhoufan.fragmentdemo I/ZF: onRestart ---> MainActivity10-17 08:48:49.801 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStart ---> FragmentOne10-17 08:48:49.801 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStart ---> MainActivity10-17 08:48:49.802 7803-7803/com.zhoufan.fragmentdemo I/ZF: onResume ---> MainActivity10-17 08:48:49.802 7803-7803/com.zhoufan.fragmentdemo I/ZF: onResume ---> FragmentOne
退出Activity
10-17 08:49:35.233 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> FragmentOne10-17 08:49:35.233 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> MainActivity10-17 08:49:35.758 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> FragmentOne10-17 08:49:35.758 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> MainActivity10-17 08:49:35.758 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDestroyView ---> FragmentOne10-17 08:49:35.759 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDestroy ---> FragmentOne10-17 08:49:35.759 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDetach ---> FragmentOne10-17 08:49:35.760 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDestroy ---> MainActivity
通过上面的对比可以发现,直接添加和动态添加除了刚开始添加时候的生命周期有点区别,其他的都是一样的
2.1》Fragment家族常用的API
Fragment常用的三个类:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性
2.2》Fragment的一些常用的操作方法
a、获取FragmentManage的方式:
getFragmentManager() // v4中,getSupportFragmentManager
b、主要的操作都是FragmentTransaction的方法
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
transaction.add()
往Activity中添加一个Fragment
transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show()
显示之前隐藏的Fragment
detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()
重建view视图,附加到UI上并显示。
transatcion.commit()//提交一个事务
在这里我只贴下主Activity就好,大家一看就懂
package com.juwang.androidactivity;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.juwang.androidactivity.fragment.BlankFragment;
import com.juwang.androidactivity.fragment.TestFragment;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
private TextView testFragment;
private TextView blankFragment;
private TestFragment test;
private BlankFragment blank;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testFragment = (TextView) findViewById(R.id.test_fragment);
blankFragment = (TextView) findViewById(R.id.blank_fragment);
testFragment.setOnClickListener(this);
blankFragment.setOnClickListener(this);
setDefaultFragment();
}
/**
* 设置默认的fragment
*/
private void setDefaultFragment() {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
test = new TestFragment();
transaction.replace(R.id.fg_show, test);
transaction.commit();
}
@Override
public void onClick(View v) {
FragmentManager fm = getSupportFragmentManager();
// 开启Fragment事务
FragmentTransaction transaction = fm.beginTransaction();
switch (v.getId()) {
case R.id.test_fragment:
if (test == null) {
test = new TestFragment();
}
transaction.replace(R.id.fg_show, test);
break;
case R.id.blank_fragment:
if (blank == null) {
blank = new BlankFragment();
}
transaction.replace(R.id.fg_show, blank);
break;
}
// transaction.addToBackStack();
// 事务提交
transaction.commit();
}
}
值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。
a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。
b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。
c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。
好了,以上就是关于fragment的一些基本介绍,下一篇我们就开始讲述fragment的一些经典用法和使用fragment的过程中需要注意的一些问题。欢迎大家留言。
- Android中的Fragment
- android 中的 ViewPager+ Fragment
- android 中的 ViewPager+ Fragment
- android中的Fragment
- android中的Fragment
- Android中的Fragment使用
- android 中的 ViewPager+ Fragment
- Android中的Fragment
- android 中的 ViewPager+ Fragment
- Android中的Fragment
- android 中的 ViewPager+ Fragment
- Android中的Fragment详解
- Android 中的 ViewPager+ Fragment
- Android中的Fragment
- Android中的fragment
- android中的Fragment
- 认识Android中的Fragment
- android中的fragment
- Git6-使用github
- 函数编程实践记——总纲
- Java对象的强引用,软引用,弱引用和虚引用
- 图书购买系统之商品分类分页--根据主页面传来的值分类显示商品并实现动态分页功能
- wordpress 数据库搬家
- android中的fragment
- DLR、ASTER GDEM、SRTM3、GMTED2010等5种全球高程数据对比
- uikit——UIView——drawing
- 第四次作业-杨辉三角
- js控制li的样式,多应用于网站栏目导航默选项
- hdu1013Digital Roots
- 一个新手对javaWeb的看法
- Fast RCNN算法详解
- Gradle安装笔记