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 ...
随机推荐
- Angular 开发NPM第三方包
步骤: 创建第三方包 > 开发第三方包 > 测试第三方包 > 发布第三方包 > 使用第三方包 实例: 第一步:创建第三方包;; (创建项目,项目下创建第三方库) 1. 新建项目 ...
- Spring Boot认证:整合Jwt
背景 Jwt全称是:json web token.它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证. 优点 简洁: 可以通过 ...
- 算法题解:最大或最小的K个数(海量数据Top K问题)
题目 输入 n 个整数,找出其中最小的 k 个数.例如输入4.5.1.6.2.7.3.8 这8个数字,则最小的4个数字是1.2.3.4. 初窥 这道题最简单的思路莫过于把输入的 n 个整数排序,排序之 ...
- _self.$scopedSlots.default is not a function报错
问题: 当同一页面有elementUI的多个table表格时,如果用到v-if来动态展示表格,切换时出现如下报错: 原因: 是因为表格是element-ui通过循环产生的,而vue在dom重新渲染时有 ...
- 在Linux系统下有一个目录/usr/share/dict/ 这个目录里包含了一个词典的文本文件,我们可以利用这个文件来辨别单词是否为词典中的单词。
#!/bin/bash s=`cat /usr/share/dict/linux.words` for i in $s; do if [ $1 = $i ];then echo "$1 在字 ...
- IDEA 学习笔记之 Java项目开发
Java项目开发: 新建模块: 添加JDK: 导入本地Jars: 从远程Maven仓库下载: 创建package: 新建类/接口/枚举等: 字体太小,改字体: Duplicate Scheme 修改编 ...
- 【故障公告】docker swarm 集群问题引发的故障
我们的生产环境部署了 2 个 docker swarm 集群,集群 swarm-a 用于专门跑博客站点,集群 swarm-b 用于跑其他站点,manager 节点用了阿里云包月服务器,worker 节 ...
- wsgi相关的
目录 web 本质 http协议 请求方式 响应状态码 请求与响应文本格式 目录 web 本质 本质就是浏览器和服务器进行通信, http协议 也叫超文本传输协议(英文:HyperText T ...
- e课表项目第二次冲刺周期第四天
昨天干了什么? 昨天,我在网上搜集了相关的资料,即连接安卓自带的数据库,查询了连接的方法,然后在电脑上,做了简单的练习,发现可以用,所以对我们的软件进行数据库的连接,设置了完成按钮的活动,即先保存到数 ...
- Arouter核心思路和源码详解
前言 阅读本文之前,建议读者: 对Arouter的使用有一定的了解. 对Apt技术有所了解. Arouter是一款Alibaba出品的优秀的路由框架,本文不对其进行全面的分析,只对其最重要的功能进行源 ...