Android开发之Fragment与Acitvity通信

我自横刀向天笑,去留肝胆两昆仑。这篇文章主要讲述Android开发之Fragment与Acitvity通信相关的知识,希望能为你提供帮助。
 
上一篇我们讲到与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通信】 


    推荐阅读