上一篇我们讲到与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就能够使用了!