【Android開發】之Fragment與Acitvity通信
上一篇我們講到與Fragment有關的經常使用函數,既然Fragment被稱為是“小Activity”。如今我們來講一下Fragment怎樣與Acitivity通信。假設上一篇還有不懂得。能夠再看一下。
傳送門。
Fragment與Activity通信的方式例如以下:
一、通過初始化函數提供
1.在動態加入Fragment的過程中,我們在Activity中通過Fragment.setArguments()的方法為Fragment提供數據。
2.在Fragment中,在onAttach()函數中通過調用getArguments()
二、創建回調接口
比方說:新聞瀏覽情境下,共同擁有兩個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通信