Android_Fragment和Activity之间的通信

Fragment 的生命周期是随着activity变化而变化的。

如果activity要给在运行的时候给fragment传人数据则需要fragment实现一个自定义的接口,并且实现接口里面的方法,在activity里面保存这个接口并且在需要传人数据的时候调用这个方法即可。

如果fragment运行的时候需要给activity传数据了?activity先实现这个接口,然后在fragment里面重写onAttach(Activity act)这个方法,并在这个方法里面讲activity强制转换为接口类,然后在fragment使用的时候调用这个接口类的方法。

请看下面的例子:

activity给fragment里面传人数据:

public class MainActivity extends Activity{
    private TestFragment fragment;//fragment
    private UpdateFragment updateFragment;//fragment实现的接口
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        initView();

    }
    private void initView() {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragment = new TestFragment();
        updateFragment = fragment;
        fragmentTransaction.add(R.id.main, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commitAllowingStateLoss();
    }
    @Override
    protected void onResume() {
        //改变fragment里面textView的值
        updateFragment.setData("王五");
        super.onResume();
    }

}

接口类

public interface UpdateFragment {
    void setData(String str);
}

Fragment类:

public class TestFragment extends Fragment implements UpdateFragment{

    private View view;
    private TextView txt;
    public TestFragment() {
        super();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (null == view){
            view = inflater.inflate(R.layout.activity_main, container, false);
            txt = (TextView)view.findViewById(R.id.tv);
        }
        return view;
    }
    @Override
    public void setData(String str) {
        if (null != txt) {
            txt.setText(str);
        }
    }

}

Fragment给activity传入数据demo:

Activity类:

public class MainActivity extends Activity implements UpdateFragment{
    private static final String TAG = MainActivity.class.getSimpleName();
    private TestFragment fragment;//fragment
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        initView();

    }
    private void initView() {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragment = new TestFragment();
        fragmentTransaction.add(R.id.main, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commitAllowingStateLoss();
    }
    @Override
    protected void onResume() {
        super.onResume();
    }
    @Override
    public void setData(String str) {
        if (null != str ){
            Log.d(TAG, "setData:"+str);
        }
    }

接口类和上面的是一样的就不写了

Fragment类:

public class TestFragment extends Fragment{

    private View view;
    private TextView txt;
    private Button btn;
    private UpdateFragment updateFragment;
    public TestFragment() {
        super();
    }

    @Override
    public void onAttach(Activity activity) {
        try {
            updateFragment = (UpdateFragment)activity;
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onAttach(activity);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (null == view){
            view = inflater.inflate(R.layout.activity_main, container, false);
            txt = (TextView)view.findViewById(R.id.tv);
            btn = (Button)view.findViewById(R.id.btn);
            btn.setOnClickListener(clickListener);
        }
        return view;
    }
    private OnClickListener clickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (null != txt) {
                updateFragment.setData(txt.getText().toString());
            }

        }
    };

}
时间: 2024-10-10 17:12:20

Android_Fragment和Activity之间的通信的相关文章

Android——Fragment和Activity之间的通信+Frangment生命周期

Android--Fragment和Activity之间的通信+Frangment生命周期 Fr'agment和Activity之间的通信 1.在Fragment中声明一个接口. 2.在Activity中实现在Fargment中声明的接口. 3.在Fragment中声明一个接口对象. 4.在Frangment的生命周期Onattach方法中判断当前Activity是否实现了此Fragment中声明的接口.如果已实现,就把当前Activity转换成接口对象. 5.调用Activity中实现的方法=

Fragment的生命周期和Activity之间的通信以及使用

Fragment通俗来讲就是碎片,不能单独存在,意思就是说必须依附于Activity,一般来说有两种方式把Fragment加到Activity,分为静态,动态. 静态即为右键单击,建立一个Fragment,选择Blank,在Activity布局中直接加fragment,name属性直接指向之前建立的Fragment,这就添加上了Fragment,这种较为简单. 动态: 我们要做的是在Activity中添加一个Fragment,Fragment中有两个按钮,当按下按钮时分别切换不同的Fragmen

android中fragment和activity之间相互通信

在用到fragment的时候,老是会遇到一个问题,就是fragment与activity之间的通信.下面就来记录一下activity和fragment之间 通过实现接口来互相通信的方法. 1. activity 向fragment发出通信,就这么写: private OnMainListener mainListener; // 绑定接口 @Override public void onAttachFragment(Fragmentfragment) { try { mainListener =

Android中两个Activity之间简单通信

在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信息的发起者为Test,接收者为Target,代码如下: Test类: 1 package com.example.testsend; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivit

Android中BroadCast与Activity之间的通信

在看本文之前,如果你对于Android的广播机制不是很了解,建议先行阅读我转载的一篇博文:图解 Android 广播机制. 由于本案例比较简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: MainActivity的代码如下: package com.gc.testbroadcasedemo; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Cont

android中fragment的使用及与activity之间的通信

一.fragment的生命周期,具体方法什么时候调用就不说了. 二 在activity中使用fragment和通信有两种常见的方式, 1.静态的方式 (1)定义一个类继承Fragment,如 MyFragment,这里复写onCreateView()方法和onAttach()方法 (2)onCreateView()加载一些布局对象以及设置View对象,并返回一个View对象,onAttach()通信的时候用到 (3)在activity的layout的布局文件中引用Fragment继承类(注意设置

Service和Activity之间的通信

Service的启动方式有两种,一种是通过start方式,一种是通过bind方式,通过start方式启动服务后,启动服务的组件和服务便没有多大联系了.所以为了能和Service通信,只能通过bind的方式.下面分几步介绍下:(demo里面的Service提供一个下载的功能,然后在Activity中决定何时开始下载,以及随时查看下载进度) 第一步: 在Service类中创建一个内部类继承自Binder(onBind方法返回IBinder接口,Binder类是IBinder接口的实现类)(看到这里还

安卓activity之间互相通信的问题

============问题描述============ 大侠,如果我想在activity A中启动activity B,然后activity A还能向B发送状态信息,B再根据A发送来的状态决定自身的变化,比如A发送退出命令,B接收之后就finish,这样的想法能实现吗? 之所有有这样的需求是因为,比如在登录的时候,考虑到网络延迟的关系,在用户点按钮时,我想要出现一个loading的界面,覆盖在登录界面上面,然后当服务端返回成功,loading的那个界面就变成一个对号√的图片,失败就变成一个叉×

Fragment 与Activity之间的通信

1.Fragment-->Activity 在fragment中的onAttach()中引用Activity实现的接口实例. 2Activity-->Fragment 直接调用 3多个Fragment通信 通过Actiity间接通信