1. 程式人生 > >Activity與Fragment之間的通訊詳解

Activity與Fragment之間的通訊詳解

      當我們使用Fragment的時候會常常與其他的Fragment或者宿主Activity進行互動,今天我們就來講講Fragment和Activity之間如何進行通訊。

      一、 介面回撥機制

     在講Fragment和Android通訊之前,我們先看一個應用場景,現在有一個需求,在Activity中有一個Button,有個一TextView。現在業務要求是這樣,點選Button,改變TextView的值。這是一個再簡單不過的Demo,我們通常會這樣實現,例項化兩個控制元件,然後為Button新增一個onClickListener事件,然後當前Activity實現onClickListener介面,實現onClick方法。在onClik方法中改變TextView的值。怎麼樣是不是很簡單?接下來,我們說回Fragment,現在你就把Fragment假想成一個Button,當Fragment中有事件觸發,修改Activity中是檢視資訊。邏輯和實現Button的點選事件一樣。我們在fragment裡面定義一個回撥介面(相當於Button的OnClickListener),然後要求宿主activity實現它。

當activity通過這個介面接收到一個回撥。接下來看下虛擬碼

public class FragmentA extends Fragment {
  
   public interface IOnChangUI{
       void onChandUI();
   } 

  private IOnChangUI mListener;
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
    ...
     @Override
   public void onClick(View view ) { 
        mListener.onArticleSelected(noteUri);
    } 

 }
這樣介面回撥機制實現Fragment和Activity之間的通訊就完成了

      二、廣播實現通訊

      這個實現起來也比較簡單,在宿主Activity裡面註冊廣播,當需要通訊的時候在Fragment中傳送廣播,宿主Activity中接受到廣播,進行相應處理即可。這種方式比較靈活,也比較簡單,沒有介面回撥那麼多介面和處理。Fragment和Activity之間耦合度也較低

     三、使用第三方框架EventBus

     這個可以說是最簡單的一種方式,EventBus是專門用於元件間通訊的一個開源框架,使用起來也就幾行程式碼的事情,讓Fragment和Activity之間沒有耦合。但弊端也顯而易見,使用框架固然簡單,但效能上肯定沒有你自己實現高。當就目前裝置效能而言,這點效能浪費還是可以接受的。

       通訊的方式或許還有其他,我自己常用就三種方式。最好還有一點需要提醒大家,無論你使用那種方式,都必須考慮一個問題,Fragment的拓展性,Fragment設計出來的初衷是元件的碎片化,易於複用,千萬不要讓Fragment和Activity高度耦合,那樣Fragment就失去他原本的意義了   

相關推薦

ActivityFragment之間通訊

      當我們使用Fragment的時候會常常與其他的Fragment或者宿主Activity進行互動,今天我們就來講講Fragment和Activity之間如何進行通訊。       一、 介面回撥機制      在講Fragment和Android通訊之前,我們先看

activityfragment之間的傳遞資料

首先activity之間的資料傳遞就是 用intent和intent+bundle intent 傳遞 Intent i= new Intent(MainActivity.this,TheAty.class); i.putExtra("date","Hello

ActivityFragment之間跳轉實現

1.實現Activity到Fragment之間的跳轉 首先在MainActivity的條件函式中加入如下程式碼 Intent mIntent = new Intent(MainActivity.this,Menu.class); mIntent.putExtra("id",1); start

Parcelable序列化類在ActivityFragment之間通訊

要讓一個類的物件序列化,我們首先得讓這個類實現Parcelable介面,我自己定義的一個類如下: public class NewPlan implements Parcelable{ private Long id; private St

Activityfragment之間的傳值:fragment的setArguments()和getArguments()

當Activity類動態載入fragment時可以通過fragment的setArguments()傳入值,並在fragment類中通過fragment的getArguments()方法獲得傳入的值; 下面演示一下程式碼: MainActivity.java

Android中ActivityFragment之間資料相互傳遞

一、Activity啟動Activity Intent intent = new Intent(this,MainListActivity.class); startActivity(intent); Activity與Activity傳遞資料 I

activityfragment以及fragmentfragment之間通訊

activity向其引用的fragment傳值 第一步 : Activity中建立Fragment物件 , 呼叫setArguments(bundle) 方法儲存值 第二步 : Fragment

ActivityFragment的生命週期

在安卓中Activity與Fragment是非常相似的兩個類,它們各自都擁有自己的生命週期,且都可以用來顯示佈局檔案中的檢視。其中Activity是通過setContenView()顯示檢視,而Fra

Android面試篇之ActivityFragmentFragmentFragment之間通訊

Activity與Fragment Activity向Fragment通訊 ① 拿到Fragment的引用,直接呼叫其public方法。 ② 如果Activity中未儲存任何Fragment的引用,

ActivityFragment通訊

1、在fragment裡設定一個方法   public class MyFragment extends Fragment { private String mText; public void setPosition(String text) {

stm32f103mpu6050通訊

在做微控制器與mpu6050通訊之前我們得了解下mpu6050的特性和內部暫存器,而微控制器和mpu6050的通訊就是通過配置內部暫存器來實現的。 -------------------------------------華麗的分割線(以下介紹MPU6050的基礎知識)-------------

ActivityFragment通訊 多介面實現優化

1.問題 我們都知道Activity與Fragment通訊的幾種方式,推崇的應該是谷歌給出的介面方案。 地址:https://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

Tomcat 連線數執行緒池 | BIO/NIO有何不同 | 簡談Kafka中的NIO網路通訊模型

前言 在使用tomcat時,經常會遇到連線數、執行緒數之類的配置問題,要真正理解這些概念,必須先了解Tomcat的聯結器(Connector)。 在前面的文章 詳解Tomcat配置檔案server.xml 中寫到過:Connector的主要功能,是接收連線請求,建立Req

Glide 4.x之生命週期Activity的繫結原理

在《Glide 4.x工作總體執行流程概述》一篇博文中我們直到Glide載入圖片的步驟主要由兩個: 1、通過RequestBuilder物件建立Request物件 2、將Request物件交給RequestManager來管理,併發起請求 上面兩個步驟

西門子plcmodbus裝置進485通訊(modbus多機輪詢)

接觸西門子s7-200一段時間後,接手一個通訊專案,需要在觸控式螢幕上顯示三臺pid溫度表的溫度。 一開始打算觸控式螢幕多餘的串列埠轉485直接連線溫度表,後來由於一直通訊不上,懷疑觸控式螢幕的問題,於是打算用plc來讀取pid表,走的是modbus協議,即port1接三臺

ActivityFragment通過介面回撥進行通訊

介面回撥在Android中有很多的應用,比如Activity裡的onCreat、onDestroy等方法,按鍵事件監聽。Android對Fragment的是在Android3.0時加入的,所以Android3.0  以前的系統並不支援Fragment,而為了使3.0以前的

Android中的Fragment ---- 05(ActivityFragment之間通訊)

從Fragment往Activity方向的通訊的思路:Fragment ----> Activity :---- 需要在Fragment內部定義一個回撥介面,然後讓包含該Fragment的Activity實現該回調介面,這樣Fragment就可以呼叫該回調方法將資料傳遞

Android:Activity Fragment 通訊 (99%) 完美解決方案

前言 最近一直在想著能否有一種更好的方案來解決:Android中Activity與Fragment之間通訊的問題,什麼叫更好呢,就是能讓Fragment的複用性高,效能還有好(不用反射),程式碼還要好維護,不需要為每對Activity和Fragment之間定義介面而發愁。

Linux用戶用戶組

不為 密碼文件 控制 我們 虛擬 切換 得到 管理員 字符 1,用戶和用戶組文件 在linux中,用戶帳號,用戶密碼,用戶組信息和用戶組密碼均是存放在不同的配置文件中的。 在linux系統中,所創建的用戶帳號和其相關信息(密碼除外)均是存放在/etc/passw

HTTP協議頭部Keep-Alive模式

兩個 conn exp uid iteye 想象 ket -c ack 1、什麽是Keep-Alive模式? 我們知道HTTP協議采用“請求-應答”模式,當使用普通模式,即非KeepAlive模式時,每個請求/應答客戶和服務器都要新建一個連接,完成