1. 程式人生 > >【Android開發】之Fragment與Acitvity通信

【Android開發】之Fragment與Acitvity通信

對象 p s ets roi mit blog () open findview

  上一篇我們講到與Fragment有關的經常使用函數,既然Fragment被稱為是“小Activity”。如今我們來講一下Fragment怎樣與Acitivity通信。假設上一篇還有不懂得。能夠再看一下。

傳送門。

  Fragment與Activity通信的方式例如以下:

  一、通過初始化函數提供

    1.在動態加入Fragment的過程中,我們在Activity中通過Fragment.setArguments()的方法為Fragment提供數據。

     2.在Fragment中,在onAttach()函數中通過調用getArguments()

獲得一個Bundle對象,從而獲取我們提供的數據。

  二、創建回調接口

    比方說:新聞瀏覽情境下,共同擁有兩個Fragment。一個是用來顯示新聞標題;另外一個用來顯示新聞內容。

當我們點擊新聞標題的時候,新聞的內容就顯示到另外一個Fragment其中了。

以下我們就來通過按下Fragment1中的button來傳遞一個消息到Fragment2中。

    首先我們要做的是,在Fragment1中創建一個回調接口,而且在Activity中重寫他的方法,傳遞信息給Fragment2(舉一反三:我們也能夠傳遞給其它的Fragment)。

    以下我給出Fragment1的代碼:

package com.example.fragment;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

import com.example.fragmentdemo.R;

public class Fragment1 extends Fragment {

	private static final String TAG = "FragmentDemo";
	private OnButtonClickListener mListener;

	/**
	 * 這裏我們創建一個回調接口
	 * 
	 * @author Myp
	 * 
	 */
	public interface OnButtonClickListener {
		public void onButtonClicked();
	}

	@Override
	public void onAttach(Activity activity) {
		Log.v(TAG, "Fragment1 onAttach");
		Bundle args = getArguments();
		if (null != args) {
			/*
			 * 在這裏我們能夠將從Acivity收到的數據保存起來,而且顯示到Fragment其中。
			 */
			Log.d(TAG,
					"Fragment1 Get data from activity "
							+ args.getString("hello"));
		}

		try {
			mListener = (OnButtonClickListener) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(activity.toString()
					+ " must implement OnButtonClickListener");
		}
		super.onAttach(activity);
	}

	@Override
	public void onInflate(Activity activity, AttributeSet attrs,
			Bundle savedInstanceState) {
		Log.d(TAG, "onInflate");
		super.onInflate(activity, attrs, savedInstanceState);
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.v(TAG, "Fragment1 onCreate");
		super.onCreate(savedInstanceState);
	}

	@Override
	public void onDestroy() {
		Log.v(TAG, "Fragment1 onDestroy");
		super.onDestroy();
	}

	@Override
	public void onResume() {
		Log.v(TAG, "Fragment1 onResume");
		super.onResume();
	}

	@Override
	public void onStart() {
		Log.v(TAG, "Fragment1 onStart");
		super.onStart();
	}

	@Override
	public void onDetach() {
		Log.v(TAG, "Fragment1 onDetach");
		super.onDetach();
	}

	@Override
	public void onPause() {
		Log.v(TAG, "Fragment1 onPause");
		super.onPause();
	}

	@Override
	public void onStop() {
		Log.v(TAG, "Fragment1 onStop");
		super.onStop();
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		Log.v(TAG, "Fragment1 onCreateView");
		View view = inflater.inflate(R.layout.fragment1, container, false);
		// 為button註冊事件,而且調用回調接口,將信息返回給上層
		view.findViewById(R.id.fragment1_btn).setOnClickListener(
				new OnClickListener() {
					@Override
					public void onClick(View v) {
						mListener.onButtonClicked();
					}
				});
		return view;
	}

	@Override
	public void onDestroyView() {
		Log.v(TAG, "Fragment1 onDestroyView");
		super.onDestroyView();
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		Log.v(TAG, "Fragment1 onActivityCreated");
		super.onActivityCreated(savedInstanceState);
	}

}

    1.創建回調接口。

    2.為了確保宿主activity實現這個接口,fragment1的onAttach() 方法中通過將傳入的activity強制類型轉換,實例化一個OnButtonClickListener對象;

    3.註冊Button的Click事件,並在事件中調用回調方法。

    然後我給出Activity的代碼:

package com.example.fragmentdemo;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.widget.TextView;

import com.example.fragment.Fragment1;
import com.example.fragment.Fragment1.OnButtonClickListener;
import com.example.fragment.Fragment2;

@SuppressLint("Recycle")
public class MainActivity extends FragmentActivity implements
		OnButtonClickListener {

	private static final String TAG = "FragmentDemo";
	private Fragment1 fragment1;
	private Fragment2 fragment2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.i(TAG, "onCreate");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		fragment1 = new Fragment1();
		fragment2 = new Fragment2();
		addFragment1();
		addFragment2();
	}

	private void addFragment1() {
		Bundle args = new Bundle();
		args.putString("hello", "Hello Fragment1");
		fragment1.setArguments(args);
		Log.i(TAG, "create Fragment1");
		FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction();
		transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
		transaction.add(R.id.one, fragment1);
		transaction.addToBackStack(null);
		transaction.commit();
	}

	private void addFragment2() {
		Bundle args = new Bundle();
		args.putString("hello", "Hello Fragment2");
		fragment2.setArguments(args);
		Log.i(TAG, "create Fragment2");
		FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction();
		transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
		transaction.replace(R.id.two, fragment2);
		transaction.addToBackStack(null);
		transaction.commit();
	}

	@Override
	public void onAttachFragment(Fragment fragment) {
		Log.i(TAG, "onAttachFragment");
		super.onAttachFragment(fragment);
	}

	@Override
	protected void onDestroy() {
		Log.i(TAG, "onDestroy");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		Log.i(TAG, "onPause");
		super.onPause();
	}

	@Override
	protected void onResume() {
		Log.i(TAG, "onResume");
		super.onResume();
	}

	@Override
	protected void onStart() {
		Log.i(TAG, "onStart");
		super.onStart();
	}

	@Override
	protected void onStop() {
		Log.i(TAG, "onStop");
		super.onStop();
	}

	@Override
	protected void onRestart() {
		Log.i(TAG, "onRestart");
		super.onRestart();
	}

	@Override
	public void onButtonClicked() {
		Log.i(TAG, "onButtonClicked");
		TextView tv = (TextView) fragment1.getActivity().findViewById(
				R.id.fragment2_tv);
		tv.setText(tv.getText() + "\n從Fragment1收到數據!

"); } }


    1.通過implements實現回調接口。

    2.重寫回調方法,然後向Fragment2傳遞數據。

  三、源代碼下載

    點我下載。下載源代碼導入project就能夠使用了!

  接下來可能會介紹一下Fragment的動畫效果。有興趣的能夠關註一下。

【Android開發】之Fragment與Acitvity通信