Android - Fragment (三)不同Fragment之间的通信

在Fragment的java文件中,可以使用getActivity()来获得调用它的activity,

然后再找到另一个Fragment,进行通信

getActivity().getFragmentManager().findFragmentById(R.id.fragment_list);

但这样做耦合度太高,不方便后续的修改操作

Fragment与其附着的Activity之间的通信,都应该由Activity来完成

不能是多个Fragment之间直接通信

Fragment与其附着的Activity之间通信最佳方式:

1.    在发起事件的Fragment中定义一个接口,接口中声明你的方法

2.    在onAttach方法中要求Activity实现该接口

3.    在Activity中实现该方法

例如一个activity中布置了2个Fragment,它们之间的通信要依靠activity来完成

代码: ListStoreActivity.java   NewItemFragment.java   ListStoreFragment.java

布局文件为: liststore.xml   new_item_fragment.xml

准备布局文件:

liststore.xml 用LinearLayout中放置了2个fragment,分别指向2个Fragment文件

    <fragment
        android:id="@+id/fragment_new"
        android:name="com.rust.liststore.NewItemFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <fragment
        android:id="@+id/fragment_listview"
        android:name="com.rust.liststore.ListStoreFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

new_item_fragment.xml  中并排放置一个EditText和一个按钮

    <EditText
        android:id="@+id/edittx_new"
        android:layout_width="0dp"
        android:layout_weight="4"
        android:layout_height="wrap_content"
        android:hint="@string/hint_new" />

    <Button
        android:id="@+id/btn_add_new_item"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="@string/hint_add_new_item"
        />

ListStoreFragment.java

public class ListStoreFragment extends ListFragment{
/// 继承自ListFragment,已经封装好了listview
/// 不需要自己写ListView了
}

NewItemFragment.java 主要代码如下

   /**
     * 声明一个接口,定义向activity传递的方法
     * 绑定的activity必须实现这个方法
     */

    public interface OnNewItemAddedListener {
        public void newItemAdded(String content);
    }

    private OnNewItemAddedListener onNewItemAddedListener;

    private Button btnAddItem;
    /*复写onAttach方法*/
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            onNewItemAddedListener = (OnNewItemAddedListener) activity;
        } catch (ClassCastException e){
            throw new ClassCastException(activity.toString() + "must implement OnNewItemAddedListener");
        }
    }        

ListStoreActivity.java

加载主视图setContentView(R.layout.liststore);

两个Fragment通过 ListStoreActivity.java 来通信

在onCreate方法中获取ListStoreFragment的实例;并且复写newItemAdded方法,在里面加上业务逻辑

public class ListStoreActivity extends Activity implements OnNewItemAddedListener{
    private ArrayList<String> data;
    private ArrayAdapter<String> adapter;

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

        data = new ArrayList<String>();
        // 把data装入adapter中
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
        // ListFragment并不需要再定义一个listview
        ListStoreFragment listStoreFragment = (ListStoreFragment) getFragmentManager().findFragmentById(R.id.fragment_listview);
        listStoreFragment.setListAdapter(adapter);
    }

    @Override
    public void newItemAdded(String content) {
        //    复写接口中的方法,业务代码在这里实现
        if(!content.equals("")) {
            data.add(content);
            adapter.notifyDataSetChanged();
        }
    }
}

至此,通信搭建完成

时间: 2024-10-26 13:15:07

Android - Fragment (三)不同Fragment之间的通信的相关文章

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

Java学习笔记46(多线程三:线程之间的通信)

多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个线程一个输入,一个输出 package demo; public class Resource { public String name; public String sex; } 输入线程: package demo; public class Input implements Runnable

Android WebView js 与 java 之间相互通信

前面做手机浏览器,经常用到,js网页与Java之间的相互通信. 写个简单示例把. 1.Js 与Activity通讯 BrowserActivity.showSource("parameter"); 红:代表调用的类 蓝:代码表代用的方法名 黑:代表调用的参数 Js可以通过此方法,携带参数与Android通讯 在BrowserActivity.class里面 @JavascriptInterface  //这一句一定要加,否则调用不到 pubic  void howSource(Stri

[转][译][Android基础]Android Fragment之间的通信

2014-2-14 本篇文章翻译自Android官方的培训教程,我也是初学者,觉得官方的Training才是最好的学习材料,所以边学边翻译,有翻译不好的地方,请大家指正. 如果我们在开发过程中为了重用Fragment这个UI组件,那么我们应该把Fragment设计成是“自包含”.“模块化”组件,这种组件定义自己的布局和行为.一旦我们成功定义了这样的可重用的Fragment,我们就可以将他们与Activity进行关联,然后与整个Application进行整体的UI组装. 我们经常需要一个Fragm

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中实现的方法=

android中fragment和activity之间相互通信

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

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

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

处女男学Android(十)---Fragment完结篇之Fragment通信和ListFragment

一.前言 前两篇blog介绍了fragment的基本用法 1.Fragment API简介:如FragmentManager.FragmentTransaction等. 2.定义方式:继承Fragment类并重写onCreat.onCreatView.onPause等. 3.引用方式:通过定义<fragment>标签或者通过FragmentTrasaction实例的add()动态添加Fragment这两种. 4.Fragment回退栈与Fragment生命周期. 关于Fragment剩余的重要