fragment与activity

fragment的意思是碎片,最容易见到的地方是首页,底部有n个导航,通过切换导航按钮来显示不同的fragment。关于fragment,我们需要弄清三个点:1.fragment与activity是如何交互的;2.fragment的切换方式;3.fragment与activity的生命周期的异同

fragment与activity的生命周期:

fragment的生命周期是建立在activity的基础上,注意fragment生命周期方法出onCreateView外都需加super方法,详图如下

fragment与activity的交互方式:

activity—>fragment:在activity中传值给frag,frag通过setArgument,并且通过getArgument获取值,如下代码是在as创建fragment自动生成,fragment通过单例模式创建对象,在activity中初始化并传值到frag

Activity类:
    mOneFrag = OneFrag.newInstance("one", "1");
Fragment类:
    private String mParam1;
    private String mParam2;
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";  

public static OneFrag newInstance(String param1, String param2) {
        OneFrag fragment = new OneFrag();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

fragment—>activity:有两种方式

  1. 在activity中通过以下代码获取fragment对象
    mCurrentFrag = getSupportFragmentManager().findFragmentById(R.id.frag_content);

在fragment中增加一个接口,并在activity中实现,此代码亦为fragment自动生成,接口中方法可自行根据实际情况增减

Fragment类:
 public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }
  public interface OnFragmentInteractionListener {

        void onFragmentInteraction(Uri uri);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

fragment切换方式:

有两种切换方式,replace和add show hide。

  • replce模式指当fragment切换时都会重新运行生命周期方法,如果fragment中有数据获取操作,会造成数据重复加载
  • add模式指用add方式来进行show和hide,优点是不会重新运行生命周期方法

但是这两种也有缺点,会造成frag重叠问题。。!可通过开启安卓机的开发者模式下的不保留活动选项来复现问题

尤其是activity被回收时系统保存了frag的状态,activity恢复时显示了frag的状态,又因为activity重新运行onCreate方法,会再次绑定frag造成重叠,重叠的原理是FragmentState没有保存Fragment的显示状态,即mHidden,导致页面重启后,该值为默认的false,即show状态,所以导致了Fragment的重叠。

如何解决问题呢,我们acitivity恢复时会重新重新运行oncreate方法,则就在onCreate中判断。

Activity类:   
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
        initFragment();
        if (savedInstanceState == null) {
            customFrag(mOneFrag);
        }else {
            mCurrentFrag = getSupportFragmentManager().findFragmentById(R.id.frag_content);
        }

    }

 

转载于:https://my.oschina.net/u/3140668/blog/1821453

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值