【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传递数据。
三、源码下载
点我下载,下载源码导入工程就可以使用了!
接下来可能会介绍一下Fragment的动画效果,有兴趣的可以关注一下。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。