Android_Fragment
(一)
Faragment有自己的生命周期
Fragment依赖于Activity
Fragmen通过getActivity()可以获取所在Activity;Activity通过FragmentManager的findFragmentById()或findFragmentbyTag()获取Fragment
Fragment和Activity是多对多的关系
- MainActivity
- package com.example.fragmentdemo.UI;
- import androidx.appcompat.app.AppCompatActivity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import com.example.fragmentdemo.R;
- public class MainActivity extends AppCompatActivity {
- private Button mBtnFragment;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mBtnFragment = (Button)findViewById(R.id.btn_fragment);
- setListeners();
- }
- private void setListeners(){
- OnClick onclick = new OnClick();
- mBtnFragment.setOnClickListener(onclick);
- }
- private class OnClick implements View.OnClickListener {
- @Override
- public void onClick(View v) {
- Intent intent = null;
- switch (v.getId()){
- case R.id.btn_fragment:
- intent = new Intent(MainActivity.this,ContainerActivity.class);
- startActivity(intent);
- break;
- default:
- }
- }
- }
- }
ContainerActivity
- package com.example.fragmentdemo.UI;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.fragment.app.Fragment;
- import com.example.fragmentdemo.AFragment;
- import com.example.fragmentdemo.BFragment;
- import com.example.fragmentdemo.R;
- public class ContainerActivity extends AppCompatActivity {
- private AFragment aFragment;
- private BFragment bFragment;
- private Button mBtnChange;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_container);
- mBtnChange = (Button)findViewById(R.id.btn_change);
- mBtnChange.setOnClickListener(new View.OnClickListener(){
- @Override
- public void onClick(View v) {
- if (bFragment == null){
- bFragment = new BFragment();
- }
- getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,bFragment).commitNowAllowingStateLoss();
- }
- });
- // 实例化AFragment
- aFragment = new AFragment();
- // 把aFragment添加到Activity中 记得调用commitAllowingStateLoss
- // getSupportFragmentManager().beginTransaction().add(R.id.fl_container,aFragment).commit();
- // 当Fragment出现错误时,使用commit()方法会返回一些错误,而commitAllowingStateLoss()就不会
- getSupportFragmentManager().beginTransaction().add(R.id.fl_container,aFragment).commitAllowingStateLoss();
- // getSupportFragmentManager().beginTransaction().replace()替换
- // getSupportFragmentManager().beginTransaction().remove()移除
- }
- }
AFragment
- package com.example.fragmentdemo;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.fragment.app.Fragment;
- public class AFragment extends Fragment {
- private TextView mTvTitle;
- private Activity mActivity;
- /**
- * 返回一个视图文件,相当于activity中的setContentView()
- */
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_a,container,false);
- return view;
- }
- /**
- * 当View创建完成之后回调该方法
- */
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- mTvTitle = view.findViewById(R.id.tv_title);
- }
- }
BFragment
- package com.example.fragmentdemo;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.fragment.app.Fragment;
- public class BFragment extends Fragment {
- private TextView mTvTitle;
- /**
- * 返回一个视图文件,相当于activity中的setContentView()
- */
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_b,container,false);
- return view;
- }
- /**
- * 当View创建完成之后回调该方法
- */
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- mTvTitle = view.findViewById(R.id.tv_title);
- }
- }
(二)
Fragment中getActivity()为null的问题:当手机应用长期位于后台被回收后,当里面一些异步任务完成后回来getActivity时就为null
- package com.example.fragmentdemo;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.fragment.app.Fragment;
- public class AFragment extends Fragment {
- private TextView mTvTitle;
- private Activity mActivity;
- /**
- * 返回一个视图文件,相当于activity中的setContentView()
- */
- @Nullable
- @Override
- public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.fragment_a,container,false);
- return view;
- }
- /**
- * 当View创建完成之后回调该方法
- */
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- mTvTitle = view.findViewById(R.id.tv_title);
- if(getActivity() != null){ //判断当前activity是否为null
- }else{
- }
- }
- /**
- * 当Fragment重建或者Fragment与Activity重新建立关系时运行这个方法
- * @param context
- */
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- mActivity = (Activity)context;
- }
- /**
- * 当activity为null时必然运行了这个方法,就是Fragment与Activity脱离关系
- */
- @Override
- public void onDetach() {
- super.onDetach();
- }
- /**
- * Fragment回收
- */
- @Override
- public void onDestroy() {
- super.onDestroy();
- // 取消异步任务
- }
- }
向Fragment传递参数
- //ContainerActivity:
- aFragment = AFragment.newInstance("我是参数");//传递参数给Fragment
- //AFragment:
- /**
- *传参
- */
- public static AFragment newInstance(String title){
- AFragment fragment = new AFragment();
- Bundle bundle = new Bundle();
- bundle.putString("title",title);
- fragment.setArguments(bundle); //将bundle传入fragment;即便fragment重构,setArguments()方法也会运用反射机制将title重新放入fragment
- return fragment;
- }
- /**
- * 当View创建完成之后回调该方法
- */
- @Override
- public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- // if(getActivity() != null){ //判断当前activity是否为null
- // }else{}
- mTvTitle = view.findViewById(R.id.tv_title);
- if(getArguments() != null){
- mTvTitle.setText(getArguments().getString("title"));
- }
- }
(三)
Fragment回退栈
- AFragment:
- mBtnChange = view.findViewById(R.id.btn_change);
- mBtnReset = view.findViewById(R.id.btn_reset);
- mBtnChange.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (bFragment == null) {
- bFragment = new BFragment();
- }
- Fragment fragment = getFragmentManager().findFragmentByTag("a");
- if (fragment != null) {
- // 隐藏aFragment,再添加bFragment
- getFragmentManager().beginTransaction().hide(fragment).add(R.id.fl_container, bFragment).addToBackStack(null).commit();
- } else {
- // 在commitNowAllowingStateLoss()方法之前加addToBackStack(null)将AFragment添加到回退栈里面,这样跳到BFragment再按返回键时,返回到AFragment,而不是MainActivity
- // replace可以理解为先remove再add,导致前一个fragment的视图没有被保存下来,虽然重新创建fragment视图了,但其视图内容也被重新创建了
- getFragmentManager().beginTransaction().replace(R.id.fl_container, bFragment).addToBackStack(null).commit();
- }
- }
- });
(四)
Fragment和Activity的通信
- 方法一:
- AFragment
- mBtnMessage.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // 通过getActivity()获得Activity,然后将其转换成ContainerActivity,调用它的setData()方法
- // 该方法能够向Activity传参,但不推荐
- ((ContainerActivity)getActivity()).setData("你好"); //方法一
- }
- });
- ContainerActivity
- 3 public void setData(String text){
- mTvTitle.setText(text);
- }
这个方法可行但不推荐使用
方法二:在activity中实现fagment中声明的接口,通过回调接口来实现数据的传递
- AFragment
- /**
- * 接口
- */
- public interface IOnMessageClick{
- void onClick(String text);
- }
- /**
- * 当Fragment重建或者Fragment与Activity重新建立关系时运行这个方法
- *
- * @param context
- */
- @Override
- public void onAttach(Context context) {
- super.onAttach(context);
- // mActivity = (Activity)context;
- try{
- listener = (IOnMessageClick) context;
- } catch (ClassCastException e) {
- throw new ClassCastException("Activity 必须实现IOnMessageClick接口");
- }
- }
- mBtnMessage.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // 通过getActivity()获得Activity,然后将其转换成ContainerActivity,调用它的setData()方法
- // 该方法能够向Activity传参,但不推荐
- // ((ContainerActivity)getActivity()).setData("你好"); //方法一
- listener.onClick("你好");
- }
- });
- ContainerActivity
- @Override
- public void onClick(String text) {
- mTvTitle.setText(text);
- }
Android_Fragment的更多相关文章
- Android_Fragment(碎片)知识点讲解
今天我们来了解下Android 中的fragment(碎片)这个东西. Fragment 从英文翻译而言是碎片,片段的意思.那么这个东西是什么,在Android 中有什么用呢? 一.概念 Fragme ...
- Android_Fragment和Activity之间的通信
Fragment 的生命周期是随着activity变化而变化的. 如果activity要给在运行的时候给fragment传人数据则需要fragment实现一个自定义的接口,并且实现接口里面的方法,在a ...
- Android_Fragment栈操作 commit()问题分析
栈操作时遇到一个问题 getFragmentManager().beginTransaction() .replace(R.id.fl_container,bFragment) .addToBackS ...
- Activity与Fragment
Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似. Fragment是用来描述一些行为或一部分用户界面在一个Activi ...
- Android编码学习之Fragment
1. 什么是Fragment Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似.Fragment是用来描述一些行为或一部 ...
- Fragment、Activity比较——Android碎片介绍
Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...
随机推荐
- 推荐几个我近期排查线上http接口偶发415时用到的工具
导读:近期有一个业务部门的同学反馈说他负责的C工程在小概率情况下SpringMvc会返回415,通过输出的日志可以确定是SpringMvc找不到content-type这个头了,具体为什么找不到了呢? ...
- Python实现几种简单的排序算法
一.冒泡排序 概念:为一个无序的列表排成有序的 实现过程描述:(升序) 1.比较相邻的元素,如果第一个比第二个大,就交换他们的位置 2.对每一对相邻元素重复1的工作,从开始第一队到最后一对,最后结束的 ...
- 十大排序算法JavaScript实现总结
花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...
- Android之各个版本之间的变化
(1)android5.0 Android5.0之后隐式打开服务需要指明包名 (2)android6.0 Android6.0之后涉及隐私的权限必须动态申请 (3)android8.0 android ...
- ECMAScript6 VS TypeScript
如果你真正使用过Typescript你会发现他其实是javascript的超集, 这是一个非常简洁的描述 ,之所以称之为Typescript,正是Type一词的表述(强类型),可不仅仅是有一个Clas ...
- 简单自定义mybatis流程!!
----简单自定义mybatis流程----一.首先封装daoMapperxml文件和sqlMapconfig配置文件,如何封装:(1).封装我们的Mapper.xml文件,提取名称空间namespa ...
- django开发中关于外键设置
django开发中关于外键设置 我们建模型的时候会用到ForeignKey 而由于外键的约数会导致一些保存 所有我们ctrl+左键进入源码 源码 def __init__(self, to, on_d ...
- PHP弱性处理0e开头md5哈希字符串缺陷/bug
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他 ...
- PHP yield代替range生成范围内的数
<?php function yieldRange($start, $limit, $step) { if ($start == $limit || $step == 0) { return $ ...
- 【Java基础】谈谈集合.CopyOnWriteArrayList
目录 实现原理 遍历时不用加锁的原因 CopyOnWriteArrayLis的缺点 使用场景 总结 参考 本篇博客介绍CopyOnWriteArrayList类,读完本博客你将会了解: 什么是COW机 ...