Fragment的动态添加以及数据传输分析

Fragment的发展

Android从3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局。Fragment通常是嵌套在Activity中使用的。

Fragment的生命周期

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:
这里写图片描述

可以看到Fragment比Activity多了几个额外的生命周期回调方法:

  • onAttach(Activity)

    当Fragment与Activity发生关联时调用。
    
  • onCreateView(LayoutInflater, ViewGroup,Bundle)

    创建该Fragment的视图
    
  • onActivityCreated(Bundle)

    当Activity的onCreate方法返回时调用
    
  • onDestoryView()

    与onCreateView想对应,当该Fragment的视图被移除时调用
    
  • onDetach()

    与onAttach相对应,当Fragment与Activity关联被取消时调用
    

    注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现

下面我们一起看下本博客项目的预览图:

这里写图片描述

效果很简单粗暴,实现了动态添加fragment,fragment间的数据传递,fragment与activity的数据传递,都是比较常用的。

现在我们一起来分析这段实现代码:

  • MainActivity:
package com.cc.csdndemo.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.cc.csdndemo.R;
import com.cc.csdndemo.fragment.FirstFragment;
import com.cc.csdndemo.fragment.SecondFragment;
import com.cc.csdndemo.fragment.ThreeFragment;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button firstBTN, secondBTN, threeBTN;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById();
        setOnclickListener();
        initView();
    }

    private void findViewById() {
        firstBTN = (Button) findViewById(R.id.firstBTN);
        secondBTN = (Button) findViewById(R.id.secondBTN);
        threeBTN = (Button) findViewById(R.id.threeBTN);
    }

    private void setOnclickListener() {
        firstBTN.setOnClickListener(this);
        secondBTN.setOnClickListener(this);
        threeBTN.setOnClickListener(this);
    }

    private void initView() {
        getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new FirstFragment()).commit();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.firstBTN:
                getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new FirstFragment()).addToBackStack(null).commit();
                break;
            case R.id.secondBTN:
                getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new SecondFragment()).addToBackStack(null).commit();
                break;
            case R.id.threeBTN:
                getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new ThreeFragment()).addToBackStack(null).commit();
                break;
        }
    }
}
  • 动态添加fragment:

以上就是MainActivity主要代码,这里面有几点需要我们注意,getSupportFragmentManager().beginTransaction().replace(R.id.contentF, new FirstFragment()).commit();这个用法就是动态替换fragment的关键,首先我们需要通过getSupportFragmentManager()获取Fragment的管理器,第二步开启事务,然后动态替换显示控件,最终提交生效,addToBackStack(null)这个并不是必须的 ,这个是把fragment添加到回退栈中,让我们可以原步骤返回。

  • fragment传递数据:
    FirstFragment:
package com.cc.csdndemo.fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

import com.cc.csdndemo.R;

/**
 * A simple {@link Fragment} subclass.
 */
public class FirstFragment extends Fragment implements View.OnClickListener {

    private EditText editText;
    private Button button;

    public FirstFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        editText = (EditText) view.findViewById(R.id.firstET);
        button = (Button) view.findViewById(R.id.passParameterBTN);
        button.setOnClickListener(this);
        return view;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.passParameterBTN:
                //获取输入框的内容
                String s = editText.getText().toString().trim();
                //传递给下一个fragment
                SecondFragment secondFragment = new SecondFragment();
                Bundle bundle = new Bundle();
                bundle.putString("pass", s);
                secondFragment.setArguments(bundle);
                getFragmentManager().beginTransaction().replace(R.id.contentF, secondFragment).addToBackStack(null).commit();
                break;
        }
    }


}

fragment之间传递数据的关键就在于secondFragment.setArguments(bundle);这里面需要传递bundle的类型参数,把需要传递的数据通过bundle携带,最终通过getFragmentManager().beginTransaction().replace(R.id.contentF, secondFragment).addToBackStack(null).commit();传递出去。

  • SecondFragment:
package com.cc.csdndemo.fragment;


import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.cc.csdndemo.R;
import com.cc.csdndemo.activity.Main2Activity;

/**
 * A simple {@link Fragment} subclass.
 */
public class SecondFragment extends Fragment implements View.OnClickListener {

    private TextView secondTV;
    private Button activityPassParameterBTN;

    public SecondFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_second, container, false);
        secondTV = (TextView) view.findViewById(R.id.secondTV);
        activityPassParameterBTN = (Button) view.findViewById(R.id.activityPassParameterBTN);
        activityPassParameterBTN.setOnClickListener(this);
        //判断是否有值传递过来
        if (getArguments() != null) {
            String s = getArguments().getString("pass");
            secondTV.setText(s);
        }
        return view;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.activityPassParameterBTN:
                //需要传递给activity的数据
                String s = secondTV.getText().toString();
                Intent intent = new Intent(getActivity(), Main2Activity.class);
                intent.putExtra("s", s);
                startActivity(intent);
                break;
        }
    }
}

在这里面主要实现了,接收firstFragment传递的数据,和把数据传递给下一个Activity里面,String s = getArguments().getString(“pass”);这句话就是接收fragment传递的数据;fragment与Activity数据传输还是使用intent携带数据,唯一需要注意的是通过getActivity获取Context对象。

最后附上完整代码:http://download.csdn.net/detail/qq_33792946/9730556

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值