zoukankan      html  css  js  c++  java
  • 【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() + "
    从Fragment1收到数据!

    "); } }


        1.通过implements实现回调接口。

        2.重写回调方法,然后向Fragment2传递数据。

     

      三、源代码下载

        点我下载。下载源代码导入project就能够使用了!

     

      接下来可能会介绍一下Fragment的动画效果。有兴趣的能够关注一下。

     

  • 相关阅读:
    淘宝客服务费和佣金的区别是什么
    java编程出现的错误对应的解决方法
    若遇到APP无法抓包怎么办,可以通过安装drony 进行转发抓包
    Android逆向—苏宁金融app的data参数分析
    GMSSL 支持SM2/SM3/SM4
    Frida安装和使用
    JS 解析 bytearray 成字符串
    Pytorch-tensor的创建,索引,切片
    深度学习实战之线性回归1
    CCF CSP 201803-2 碰撞的小球
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7040563.html
Copyright © 2011-2022 走看看