Android Fragment和Activity数据或对象的传递总结

46 篇文章 0 订阅
4 篇文章 0 订阅

Android Fragment和Activity数据或对象的传递总结

本文将展示Activity和Fragment之间、Fragment和Fragment的数据传递和对象改变,并作简要说明。

一.基础知识

(一)Activity获取Fragment的对象

1.可以通过findViewById或findViewByTag找到,一般用于静态创建的Fragment

//获取碎片A的对象 
fragmentA= (FragmentA) getActivity().getSupportFragmentManager().findFragmentById(R.id.main_frag1);

2.可以通过Fragment的集合对象获取到,一般用于动态创建的Fragment

比如获取碎片集合中的第一个碎片对象: 
 Fragment1 fragment1 = (Fragment1) getSupportFragmentManager().getFragments().get(0);

(二)Fragment中获取到Acitvity中的对象

这个就简单了,直接个体Activity然后强转成对应的Activity就可以了

   MyActivity myActivity = (MyActivity) (getActivity());

二.示例

实现:Activity可以读取并改变Fragment1和Fragment2对象的数据。同时,Fragment1可以读取和改变Activity和Fragment2的数据。Fragment2也是读取和改变Fragment1和Activity中的数据。

效果:

s

动态效果图:

s2
2
s3
这里贴一下MyActivity和Fragment1的代码

MyActivity:

package com.example.viewPager2;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MyActivity extends FragmentActivity {

    List<Fragment> list = new ArrayList<Fragment>();
    ViewPager viewPager;

    String myActivityString;
    User myActivityUser;
    TextView tv_main_show;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myActivityString = new String("这是MyActivity的字符串");
        myActivityUser = new User("myActivityUser", 18);
        Fragment1 fragmemt1 = new Fragment1();
        Fragment2 fragmemt2 = new Fragment2();
        list.add(fragmemt1);
        list.add(fragmemt2);
        viewPager = (ViewPager) findViewById(R.id.home_vp);
        tv_main_show = (TextView) findViewById(R.id.tv_main_show);
        //创建适配器,设置的碎片管理器使用的是getChildFragmentManager()
        Myadapter adapter = new Myadapter(getSupportFragmentManager());

        //给ViewPager设置适配器
        viewPager.setAdapter(adapter);
    }

    //创建ViewPager适配器的类
    class Myadapter extends FragmentStatePagerAdapter {

        public Myadapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return list.get(position);
        }

        @Override
        public int getCount() {
            return list.size();
        }
    }

    /**
     * 获取Fragment1中的数据
     *
     * @param view
     */
    public void getFragment1Data(View view) {

        String msg = ((Fragment1) getSupportFragmentManager().getFragments().get(0)).fragment1String;
        User msg2 = ((Fragment1) getSupportFragmentManager().getFragments().get(0)).fragment1User;
        Toast.makeText(this, msg + msg2, Toast.LENGTH_SHORT).show();
    }

    /**
     * 获取Fragment2中的数据
     *
     * @param view
     */
    public void getFragment2Data(View view) {
        String msg = ((Fragment2) getSupportFragmentManager().getFragments().get(1)).fragment2String;
        User msg2 = ((Fragment2) getSupportFragmentManager().getFragments().get(1)).fragment2User;
        Toast.makeText(this, msg + msg2, Toast.LENGTH_SHORT).show();
    }

    /**
     * 改变Fragment1中显示的内容
     */
    public void changeFragment1Data(View view) {
        Fragment1 fragment1 = (Fragment1) getSupportFragmentManager().getFragments().get(0);
        fragment1.tv_fragment1_show.append("\nMyActivity在这里改变了数据");
    }

    /**
     * 改变Fragment2中显示的内容
     */
    public void changeFragment2Data(View view) {
        Fragment2 fragment2 = (Fragment2) getSupportFragmentManager().getFragments().get(1);
        fragment2.tv_fragment2_show.append("\nMyActivity在这里改变了数据");

    }

}

Fragment1:

package com.example.viewPager2;

import android.os.Bundle;
import android.support.annotation.Nullable;
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 android.widget.Toast;

/**
 * 碎片页面1
 */
public class Fragment1 extends Fragment implements View.OnClickListener {


    String fragment1String;
    User fragment1User;
    TextView tv_fragment1_show;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        fragment1String = new String("这是Fragment1页面的数据");
        fragment1User = new User("fragment1User", 88);
        View view = inflater.inflate(R.layout.fragment1, null);
        Button btn_getMyActivityData = (Button) view.findViewById(R.id.btn_getMyActivityData);
        Button btn_getFragment2Data = (Button) view.findViewById(R.id.btn_getFragment2Data);
        Button btn_changeMyActivityData = (Button) view.findViewById(R.id.btn_changeMyActivityData);
        Button btn_changeFragment2Data = (Button) view.findViewById(R.id.btn_changeFragment2Data);
        tv_fragment1_show = (TextView) view.findViewById(R.id.tv_fragment1_show);

        btn_getMyActivityData.setOnClickListener(this);
        btn_getFragment2Data.setOnClickListener(this);
        btn_changeMyActivityData.setOnClickListener(this);
        btn_changeFragment2Data.setOnClickListener(this);
        return view;
    }


    @Override
    public void onClick(View v) {
        String msg = "";
        User user = null;

        /**
         * 获取MyActivity中的数据
         */
        if (v.getId() == R.id.btn_getMyActivityData) {
            msg = ((MyActivity) (getActivity())).myActivityString;
            user = ((MyActivity) (getActivity())).myActivityUser;
            Toast.makeText(getActivity(), msg + user, Toast.LENGTH_SHORT).show();
        }

        /**
         * 获取Fragment2中的数据
         */
        if (v.getId() == R.id.btn_getFragment2Data) {
            msg = ((Fragment2) getFragmentManager().getFragments().get(1)).fragment2String;
            user = ((Fragment2) getFragmentManager().getFragments().get(1)).fragment2User;
            Toast.makeText(getActivity(), msg + user, Toast.LENGTH_SHORT).show();
        }

        /**
         * 改变MyActivity中的数据
         */
        if (v.getId() == R.id.btn_changeMyActivityData) {
            MyActivity myActivity = (MyActivity) (getActivity());
            myActivity.tv_main_show.append("\nFragment1改变了这里的数据");
        }


        /**
         * 改变Fragment2中的数据
         */
        if (v.getId() == R.id.btn_changeFragment2Data) {
            Fragment2 fragment2 = (Fragment2) getFragmentManager().getFragments().get(1);
            fragment2.tv_fragment2_show.append("\nFragment1改变了这里的数据");
        }
    }
}

有时候使用Fragmentd相关类报错,有可能是V4包的源码有问题(版本原因),我的项目里有正确的v4包。

这个项目的源码地址:
http://download.csdn.net/detail/wenzhi20102321/9818301

关于Fragment和ViewPage的详细使用和相关知识的总结,很早以前写过:
还是比较详细的:

Fragment:

http://blog.csdn.net/wenzhi20102321/article/details/53572610

ViewPager和Fragment:

http://blog.csdn.net/wenzhi20102321/article/details/53584344

共勉:哪个人成功会随随便便!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值