从Fragment中传数据到Activity

原创 2015年11月18日 01:00:29

从Fragment中传数据到Activity


背景

这是在项目中遇到的问题。在一个Activity中,有viewpager,viewpager里面放置的当然那是fragment了,然后fragment中有button什么的,在点击button的时候,希望能够改变Activity中的一些数据。
比如最常见的通过viewpager选择标签等。
之前想到的解决办法是直接将Activity中的控件等需要接受响应之后改变数据的类型都设为static,这是个很愚蠢的方法,容易造成内存泄露。

解决方法

通过在fragment中实现接口来解决。

1.在fragment用onAttach方法连接到上下文

    private Activity activity;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if (context instanceof Activity){
            activity = (Activity)context;
        }
    }

2.对fragment中发出响应的控件加上接口

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.my_fragment, container, false);

        Button button = (Button) view.findViewById(R.id.button);
        button.setText(getArguments().getString("MESSAGE"));
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    ((OnButtonClickListener)activity)
                            .OnButtonClick(getArguments().getInt("POSITION"));
                } catch (ClassCastException cce){
                    cce.printStackTrace();
                }
            }
        });

        return view;
    }

    public interface OnButtonClickListener {
        void OnButtonClick(int position);
    }

3.在Activity中对接口进行处理:

public class MainActivity extends AppCompatActivity 
        implements MyFragment.OnButtonClickListener {

    private TextView text;

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

        text = (TextView)findViewById(R.id.text_view);

        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager()));
    }

    @Override
    public void OnButtonClick(int position) {
        text.setText("Click button " + position);
    }
}

效果

这里写图片描述

代码

代码在此

Fragment学习之Activity传递数据到Fragment

上一篇文章我们理解怎样使用接口回调的方式将数据从Fragment传递到Activity中
  • lzm1340458776
  • lzm1340458776
  • 2014年05月07日 14:58
  • 6784

Activity与Fragment数据传递之Fragment从Activity获取数据

整理Fragment与Activity之间的数据交换,大体上包括三种: 1、Fragment从Activity获取数据 2、Activity从Fragment获取数据 3、Fragment之间获取数...
  • u010963246
  • u010963246
  • 2015年07月01日 14:12
  • 18353

android中传递复杂参数,activity之间和fragment之间的bundle传递集合/对象

在Android开发中,Activity之间通过Intent使用bundle,fragment之间和Activityty通过setArguments使用bundle,对于一些简单的参数传递比较简单,而...
  • Kern_
  • Kern_
  • 2015年05月25日 20:59
  • 10091

android数据传递(三)之Activity传递到Fragment

其实Activity和fragment之间传递数据有很多方法,我这里说一个用的比较多的一个方法——接口回调,后面有运行效果 接口回调有几个步骤: 1,要传递数据的类A里面定义一个接口X,接口里面创建一...
  • dl10210950
  • dl10210950
  • 2016年08月17日 20:28
  • 8291

【Fragment精深系列4】Fragment与Activity之间的数据交互

一、Activity把值传递给Fragment  在activity中创建bundle数据包,并调用fragment的setArguments(Bundle bundle)方法,即可将Bundle数据...
  • a910626
  • a910626
  • 2015年05月26日 09:21
  • 14873

Activity Fragment数据传递(对象)引用不变问题

一.背景 一天写代码出了bug,Activity传给fragment的arraylist经过fragment中的修改居然会改变activity的arrayList(之前传给fragment的那个),...
  • u011889786
  • u011889786
  • 2017年02月12日 21:13
  • 528

通过一个activity打开多个fragment,每个fragment包含一个List

本人新手,第一次写博客,学习androids
  • u012519561
  • u012519561
  • 2014年09月17日 14:34
  • 926

如何从Activity传递参数到Fragment中

本例,Activity从全局变量中获取用户名和认证结果的参数,需要将参数
  • windvally
  • windvally
  • 2014年07月19日 18:47
  • 2915

Activity如何传递数据给Fragment——回调方法

【声明】转载请注明出处,此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail ——尊重作者,知识无价,交流无限! 需求:Activity传递数据...
  • huntersnail
  • huntersnail
  • 2015年07月17日 10:23
  • 3612

kotlin在主程序中提交数据到fragment中并显示的简单练习

MainActivity.kt   package com.example.administrator.kt_test import android.app.FragmentManager impo...
  • qq_36336333
  • qq_36336333
  • 2017年11月18日 18:29
  • 92
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从Fragment中传数据到Activity
举报原因:
原因补充:

(最多只允许输入30个字)