1. 程式人生 > >Activity與Fragment通過介面回撥進行通訊

Activity與Fragment通過介面回撥進行通訊

介面回撥在Android中有很多的應用,比如Activity裡的onCreat、onDestroy等方法,按鍵事件監聽。Android對Fragment的是在Android3.0時加入的,所以Android3.0  以前的系統並不支援Fragment,而為了使3.0以前的版本也支援Fragment,Google便推出了Android-support-v4.jar。我這裡使用的是Android系統自帶的Fragment,而不是使用Android-support-v4.jar包裡的Fragment。Activity新增Fragment有靜態和動態兩種方式,本文使用靜態方式新增Fragment。下面具體介紹:

本工程實現的功能是:點選FragmentFirst裡的FirstBtn按鈕在FragmentSecond裡顯示“點選了btn1”,點選FragmentFirst裡的SecondBtn按鈕在FragmentSecond裡顯示“點選了btn2”。效果圖如下

第一步是搭建工程框架:

Activity:1個 ;layout:3個;Fragment:2個  ;

MainActivity對應activity_main.layout  ;FragmentFirst對應fragment_first.xml  ;FragmentSecond對應fragment_second.xml  ;

工程目錄結構如下圖。

第二步:寫xml佈局檔案

在activity_main.xml檔案裡面包含了兩個fragment控制元件。很顯然包含的是我們要使用的兩個fragment,如下圖:

再看fragment_first.xml檔案,包含了兩個按鈕,用來出發事件,如下圖:

最後看一下fragment_second.xml檔案,僅僅包含了一個TextVIew控制元件用於顯示按鈕觸發後的內容顯示,如下圖:

第三步:FragmentFirst、FragmentSecond、MainActivity的實現

FragmentFirst與MainActivity之間使用介面回撥的方法進行通訊。總體來說,在FragmentFirst裡宣告、定義、初始化、使用介面FragmentFirstInterface,FragmentFirstInterface 在類FragmentFirst裡面;而在MainActivity裡面繼承介面FragmentFirstInterface,並具體實現介面函式public void fragment_first_callback(String str)

;

介面的宣告:

<span style="white-space:pre">	</span>/*
	 * 回撥介面宣告
	 * */
	public interface FragmentFirstInterface {
		
		public void fragment_first_callback(String str);
	}

介面的定義:

<span style="white-space:pre">	</span>/*
	 * 回撥介面定義
	 * */
	private FragmentFirstInterface fragmentFirstInterface;

在Fragment的回撥函式onAttach裡面對介面進行初始化:

<span style="white-space:pre">	</span>@Override
	public void onAttach(Activity activity){
		super.onAttach(activity);
		/*
		 * 回撥介面初始化
		 * */
		fragmentFirstInterface = (FragmentFirstInterface) activity;
	}

介面的使用是在點選按鈕的時候:

<span style="white-space:pre">	</span>getActivity().findViewById(R.id.btn_1).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				/*
				 * 呼叫回撥介面函式
				 * */
				fragmentFirstInterface.fragment_first_callback("btn1");
			}
		});
        getActivity().findViewById(R.id.btn_2).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				/*
				 * 呼叫回撥介面函式
				 * */
				fragmentFirstInterface.fragment_first_callback("btn2");
			}
		});

這樣在FragmentFirst對介面的操作已經完成,那麼點選了按鈕以後在MainActivity裡是如何處理就能是activity接受到這個按鈕的點選事件呢?首先是MainActivity繼承回撥介面,然後實現介面回撥函式:

public class MainActivity extends Activity implements FragmentFirstInterface{

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

	@Override
	public void fragment_first_callback(String str) {
		// TODO Auto-generated method stub
		if(str.equals("btn1")){
			FragmentManager fragmentManager = getFragmentManager();
			FragmentSecond fragmentSecond = (FragmentSecond)fragmentManager.findFragmentById(R.id.frament_2);
			fragmentSecond.setTv("btn1");
		}
		if(str.equals("btn2")){
			FragmentManager fragmentManager = getFragmentManager();
			FragmentSecond fragmentSecond = (FragmentSecond)fragmentManager.findFragmentById(R.id.frament_2);
			fragmentSecond.setTv("btn2");
		}
	}
}

到這裡呢,MainActivity就獲得了FragmentFirst的點選事件。其實這個有點像C語言裡的函式呼叫,在fragment裡面需要的地方呼叫回撥函式,在activity裡具體實現該函式。那麼再MainActivity裡獲取FragmentFirst的點選事件後如何通知FragmentSecond進行顯示呢?看下面FragmentSecond裡的程式碼:

public class FragmentSecond extends Fragment{
	
	TextView fs_tv;
	
	@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_second, container, false);
        }
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
            fs_tv = (TextView)getActivity().findViewById(R.id.fs_tv);
	}
	
	public void setTv(String str){
		fs_tv.setText("點選了" + str);
	}
}

在FragmentSecond的回撥函式onActivityCreated裡面初始化TextView,這裡由於Fragment的生命週期的問題,這個不能在onCreateView中實現。具體原因,大家可以看這個部落格:http://blog.csdn.net/harvic880925/article/details/44917955

在MainActivity裡面直接使用findFragmentById()函式獲取frament_2,然後呼叫FragmentSecond裡的public void setTv(String str)方法來控制控制元件的顯示。

至此,就分析完了這個過程。不對的地方希望大家多多指正。

原始碼在:http://download.csdn.net/detail/dingfengen/9504561

相關推薦

ActivityFragment通過介面進行通訊

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

AdapterActivity通過介面進行互動

0. 前言 首先說明一下為什麼要寫這麼一篇部落格:最近看了一些其他人的專案,發現很多專案的做法是建立一個專門存放Adapter類的Package包,也有的專案乾脆直接都寫在Activity中。而我屬於

兩個Activity之間用介面進行通訊

因為剛接觸的一個專案是藍芽連線,需求是要在掃描介面點選條目進行連線 時,在跳轉的另一個activity(姑且先叫它連線介面吧)上顯示連線的過程, 也就是彈出一個dialog,所以就需要用介面回撥

通過介面方式來設定RecyclerView的條目點選監聽事件

提到RecyclerView大家總會拿它與ListView相比較, RecyclerView是具有比ListView更具擴充套件性的控制元件, RecyclerView繼承的是ViewGroup, 可以說也是ViewGroup的官方定義控制元件, Recycle

Android通過介面來實現資料更新(Kotlin版)

最近開發一個專案,用的是kotlin,本人kotlin水平有限,還請諒解,需要在fragment修改資料,然後更新到activity中,我使用介面回撥來完成這個需求。 先上一張圖來看一下 修改完暱稱,不僅要在fragment裡更新資料,還要同步更新act

Android在BroadcastReceiver中通過介面更新介面

之前寫廣播接收器都是寫在Activity的內部的,覺得看起來很亂的感覺,畢竟廣播也事和活動是同一級別的元件之一,哪兒能放在活動的裡面啊,決定就來封裝一下,發現居然沒有思路,,同事說用靜態類,直接點就可以了, 但是靜態類在記憶體中不會被回收,只有等程式結束後才會回收,所以決

介面進行傳值——CallBack應用舉例

public class interface_class { int aaa=3652; int getdata(CALL call){ call.get_in(aaa); return 1; } } interface CALL {

Fragment學習之使用介面的方式實現FragmentActivity通訊

Fragment與Fragment之間可以進行資訊傳遞,同樣,Fragment與Activity也可以進行資訊的傳遞。 下面是一個演示在Activity中獲取來自Fragment的資訊,使用介面回撥的方法在Activity中接收資訊 MainActivity.java:

關於在Fragment通過Activity介面操作Fragment中控制元件報空指標問題

現象描述:當Activity中某個變數改變時候,需要通知到Fragment我們常常用介面實現...。。我們在Activity中先replace,commit該Fragment,接著呼叫介面需要改變變數的方法。。。然後我們在Fragment中的介面回撥方法裡,更具該變數操縱F

Android 介面實現Fragment的跳轉

---------------------MainActivity------------------- package com.example.earl.fragmentinterfacejump; import android.app.Activity; import androi

介面----點選item中的ImageView,在Activity中顯示dialog

在做專案的時候有一個功能是:點選listview的item中的一個圖示,在activity中彈出一個dialog.想到的一個辦法就是用介面回撥來實現.對於介面回撥這一塊我其實也還是不太懂,別人寫的複雜的一點的慢慢看也能看懂,但要自己寫的話,也就只能寫一些簡單的,這個demo就是一個很簡單

ActivityFragment通訊介面實現優化

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

AIDL實現不同應用之間跨程序通訊及傳遞返回各種資料型別和遠端介面

含義:AIDL(Android Interface Definition Language),是android介面定義語言,這種語言定義了一個客戶端和伺服器通訊介面的一個標準、規範。 為什麼要有AIDL?  我們都知道android中的四大元件Activit

Android中Recyclerview使用7----條目中按鈕點選事件,在activity中呼叫(介面)

0引入Recyclerview的支援庫    compile 'com.android.support:recyclerview-v7:23.4.0' 1效果圖: 2程式碼: 2.1MainActivity中: <span style="font-size:18p

利用介面實現Fragment之間的跳轉

前言 在玩音樂播放器時,排行榜介面 涉及到幾個Fragment之間的跳轉,通過查詢自己做了一個小效果,感覺不錯,利用一個簡單的介面回撥, 分享給初學者做著玩。大神勿噴! 點選左側的按鈕,右側的內容隨著點選變化。 簡單介紹一下實現過程: 首先介面

Fragment(3)和其他Fragment之間互動--偉大的介面

這個是我一直想要找的,沒想到偉大的官網竟然有。感動到流鼻涕了。。 為了重用Fragment UI元件,我們應該建立一個完全獨立的自控的,定義自己佈局和行為的模型元件。一旦我們定義了這些可重用的Fragments,我們就可以把它們和Activity關聯起來並且用應用邏輯連線

Fragment之間的傳值 介面

//佈局 <fragment android:id="@+id/frag_left" android:name="baidumaplocation.bawei.com.chuanzhirecycle.Fragment1" android:layout_width=

Android FragmentActivity之間通過介面互傳資料通訊

1.Fragment--->Activity傳遞資料:在Fragment中建立介面,並在相應點選事件中呼叫介面內的方法onDataAction//定義介面 public interface onFragment2ActivtyListener{ public

介面fragment中的使用

         我們知道在兩個fragment之間傳遞資料要通過activity,如果兩個fragment之間發生了資料的傳遞,如果這時我們的螢幕發生翻轉activity將會啟動onCreate()方法,這時fragment中的狀態和資料將會被重置而得不到儲存,那麼如果我

Android中的介面詳解,機制:以Activity和Adapter傳遞資料為例。

首先解決啥是回撥: 我覺得這個例子比較好:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該