(一)

  • 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的通信

  1. 方法一:

     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);
    }

    这个方法可行但不推荐使用

  2. 方法二:在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的更多相关文章

  1. Android_Fragment(碎片)知识点讲解

    今天我们来了解下Android 中的fragment(碎片)这个东西. Fragment 从英文翻译而言是碎片,片段的意思.那么这个东西是什么,在Android 中有什么用呢? 一.概念 Fragme ...

  2. Android_Fragment和Activity之间的通信

    Fragment 的生命周期是随着activity变化而变化的. 如果activity要给在运行的时候给fragment传人数据则需要fragment实现一个自定义的接口,并且实现接口里面的方法,在a ...

  3. Android_Fragment栈操作 commit()问题分析

    栈操作时遇到一个问题 getFragmentManager().beginTransaction() .replace(R.id.fl_container,bFragment) .addToBackS ...

  4. Activity与Fragment

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似. Fragment是用来描述一些行为或一部分用户界面在一个Activi ...

  5. Android编码学习之Fragment

    1. 什么是Fragment Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似.Fragment是用来描述一些行为或一部 ...

  6. Fragment、Activity比较——Android碎片介绍

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...

随机推荐

  1. python Django中的cookie和session

    目录 Cookie 1.1获取Cookie 1.2设置Cookie Session 1.数据库Session 2.缓存Session 3.文件Session 4.缓存+数据库Session Cooki ...

  2. 【网络安全】给你讲清楚什么是XSS攻击

    给你讲清楚什么是XSS攻击 1. 什么是XSS攻击 跨站脚本攻击(Cross Site Scripting)本来的缩写为CSS,为了与层叠样式表(Cascading Style Sheets,CSS) ...

  3. ELK 学习笔记之 elasticsearch 基本查询

    elasticsearch 基本查询: 基本查询: term查询: terms查询: from和size查询: match查询: match_all查询: match_phrase查询: multi_ ...

  4. 小程序webview调用微信扫一扫的“曲折”思路

    自上一篇遇到webview中没有返回按钮之后,虽然跳出坑了.解决方案:<小程序webview跳转页面后没有返回按钮完美解决方案> 但是,小程序踩坑之路并没有结束.在公众号网页中通过配置AP ...

  5. 求n以内的质数(质数的定义:在大于1的自然数中,除了1和它本身意外,无法被其他自然数整除的数)

    思路: 1.(质数筛选定理)n不能够被不大于根号n的任何质数整除,则n是一个质数2.除了2的偶数都不是质数代码如下: /** * 求n内的质数 * @param int $n * @return ar ...

  6. SparkStreaming整合Flume的pull报错解决方案

    先说下版本情况: Spark 2.4.3 Scala 2.11.12 Flume-1.6.0 Flume配置文件: simple-agent.sources = netcat-source simpl ...

  7. BZOJ 4392 卡牌游戏

    Description 奶牛贝茜是卡牌游戏的狂热爱好者, 但是令人吃惊的, 她缺乏对手. 不幸的是, 任何牧 群里的其他牛都不是好对手. 他们实在是太差了 , 实际上, 他们玩卡牌游戏时会遵循一种完全 ...

  8. 无人机基于Matlab/Simulink的模型开发(连载一)

    "一切可以被控制的对象,都需要被数学量化" 这是笔者从事多年研发工作得出的道理,无论是车辆控制,机器人控制,飞机控制,还是无人机控制,所有和机械运动相关的控制,如果不能被很好的数学 ...

  9. Maya零基础新手入门教程第一部分:界面

    第1步:菜单 如果您曾经使用过一个软件,那么您将习惯菜单!在Maya中,菜单包含用于在场景中工作的工具和操作.与大多数程序一样,主菜单位于Maya窗口的顶部,然后还有面板和选项窗口的单独菜单.您还可以 ...

  10. JDBC-第1篇-基础

    话不多说,直接开撸代码. 1.首先自己的环境使用的是maven项目+idea工具+mysql8.0.18 (使用maven项目的好处就是方便,不用手动导入相关的驱动包,在pom.xml配置即可) 2. ...