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的代码:

      1 package com.example.fragment;
      2 
      3 import android.app.Activity;
      4 import android.os.Bundle;
      5 import android.support.v4.app.Fragment;
      6 import android.util.AttributeSet;
      7 import android.util.Log;
      8 import android.view.LayoutInflater;
      9 import android.view.View;
     10 import android.view.View.OnClickListener;
     11 import android.view.ViewGroup;
     12 
     13 import com.example.fragmentdemo.R;
     14 
     15 public class Fragment1 extends Fragment {
     16 
     17     private static final String TAG = "FragmentDemo";
     18     private OnButtonClickListener mListener;
     19 
     20     /**
     21      * 这里我们创建一个回调接口
     22      * 
     23      * @author Myp
     24      * 
     25      */
     26     public interface OnButtonClickListener {
     27         public void onButtonClicked();
     28     }
     29 
     30     @Override
     31     public void onAttach(Activity activity) {
     32         Log.v(TAG, "Fragment1 onAttach");
     33         Bundle args = getArguments();
     34         if (null != args) {
     35             /*
     36              * 在这里我们可以将从Acivity收到的数据保存起来,并且显示到Fragment当中。
     37              */
     38             Log.d(TAG,
     39                     "Fragment1 Get data from activity "
     40                             + args.getString("hello"));
     41         }
     42 
     43         try {
     44             mListener = (OnButtonClickListener) activity;
     45         } catch (ClassCastException e) {
     46             throw new ClassCastException(activity.toString()
     47                     + " must implement OnButtonClickListener");
     48         }
     49         super.onAttach(activity);
     50     }
     51 
     52     @Override
     53     public void onInflate(Activity activity, AttributeSet attrs,
     54             Bundle savedInstanceState) {
     55         Log.d(TAG, "onInflate");
     56         super.onInflate(activity, attrs, savedInstanceState);
     57     }
     58 
     59     @Override
     60     public void onCreate(Bundle savedInstanceState) {
     61         Log.v(TAG, "Fragment1 onCreate");
     62         super.onCreate(savedInstanceState);
     63     }
     64 
     65     @Override
     66     public void onDestroy() {
     67         Log.v(TAG, "Fragment1 onDestroy");
     68         super.onDestroy();
     69     }
     70 
     71     @Override
     72     public void onResume() {
     73         Log.v(TAG, "Fragment1 onResume");
     74         super.onResume();
     75     }
     76 
     77     @Override
     78     public void onStart() {
     79         Log.v(TAG, "Fragment1 onStart");
     80         super.onStart();
     81     }
     82 
     83     @Override
     84     public void onDetach() {
     85         Log.v(TAG, "Fragment1 onDetach");
     86         super.onDetach();
     87     }
     88 
     89     @Override
     90     public void onPause() {
     91         Log.v(TAG, "Fragment1 onPause");
     92         super.onPause();
     93     }
     94 
     95     @Override
     96     public void onStop() {
     97         Log.v(TAG, "Fragment1 onStop");
     98         super.onStop();
     99     }
    100 
    101     @Override
    102     public View onCreateView(LayoutInflater inflater, ViewGroup container,
    103             Bundle savedInstanceState) {
    104         Log.v(TAG, "Fragment1 onCreateView");
    105         View view = inflater.inflate(R.layout.fragment1, container, false);
    106         // 为button注册事件,并且调用回调接口,将信息返回给上层
    107         view.findViewById(R.id.fragment1_btn).setOnClickListener(
    108                 new OnClickListener() {
    109                     @Override
    110                     public void onClick(View v) {
    111                         mListener.onButtonClicked();
    112                     }
    113                 });
    114         return view;
    115     }
    116 
    117     @Override
    118     public void onDestroyView() {
    119         Log.v(TAG, "Fragment1 onDestroyView");
    120         super.onDestroyView();
    121     }
    122 
    123     @Override
    124     public void onActivityCreated(Bundle savedInstanceState) {
    125         Log.v(TAG, "Fragment1 onActivityCreated");
    126         super.onActivityCreated(savedInstanceState);
    127     }
    128 
    129 }
    View Code

         

        1.创建回调接口;

        2.为了确保宿主activity实现这个接口,fragment1的onAttach() 方法中通过将传入的activity强制类型转换,实例化一个OnButtonClickListener对象;

        3.注册Button的Click事件,并在事件中调用回调方法。

        然后我给出Activity的代码:

      1 package com.example.fragmentdemo;
      2 
      3 import android.annotation.SuppressLint;
      4 import android.os.Bundle;
      5 import android.support.v4.app.Fragment;
      6 import android.support.v4.app.FragmentActivity;
      7 import android.support.v4.app.FragmentTransaction;
      8 import android.util.Log;
      9 import android.widget.TextView;
     10 
     11 import com.example.fragment.Fragment1;
     12 import com.example.fragment.Fragment1.OnButtonClickListener;
     13 import com.example.fragment.Fragment2;
     14 
     15 @SuppressLint("Recycle")
     16 public class MainActivity extends FragmentActivity implements
     17         OnButtonClickListener {
     18 
     19     private static final String TAG = "FragmentDemo";
     20     private Fragment1 fragment1;
     21     private Fragment2 fragment2;
     22 
     23     @Override
     24     protected void onCreate(Bundle savedInstanceState) {
     25         Log.i(TAG, "onCreate");
     26         super.onCreate(savedInstanceState);
     27         setContentView(R.layout.activity_main);
     28         fragment1 = new Fragment1();
     29         fragment2 = new Fragment2();
     30         addFragment1();
     31         addFragment2();
     32     }
     33 
     34     private void addFragment1() {
     35         Bundle args = new Bundle();
     36         args.putString("hello", "Hello Fragment1");
     37         fragment1.setArguments(args);
     38         Log.i(TAG, "create Fragment1");
     39         FragmentTransaction transaction = getSupportFragmentManager()
     40                 .beginTransaction();
     41         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
     42         transaction.add(R.id.one, fragment1);
     43         transaction.addToBackStack(null);
     44         transaction.commit();
     45     }
     46 
     47     private void addFragment2() {
     48         Bundle args = new Bundle();
     49         args.putString("hello", "Hello Fragment2");
     50         fragment2.setArguments(args);
     51         Log.i(TAG, "create Fragment2");
     52         FragmentTransaction transaction = getSupportFragmentManager()
     53                 .beginTransaction();
     54         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
     55         transaction.replace(R.id.two, fragment2);
     56         transaction.addToBackStack(null);
     57         transaction.commit();
     58     }
     59 
     60     @Override
     61     public void onAttachFragment(Fragment fragment) {
     62         Log.i(TAG, "onAttachFragment");
     63         super.onAttachFragment(fragment);
     64     }
     65 
     66     @Override
     67     protected void onDestroy() {
     68         Log.i(TAG, "onDestroy");
     69         super.onDestroy();
     70     }
     71 
     72     @Override
     73     protected void onPause() {
     74         Log.i(TAG, "onPause");
     75         super.onPause();
     76     }
     77 
     78     @Override
     79     protected void onResume() {
     80         Log.i(TAG, "onResume");
     81         super.onResume();
     82     }
     83 
     84     @Override
     85     protected void onStart() {
     86         Log.i(TAG, "onStart");
     87         super.onStart();
     88     }
     89 
     90     @Override
     91     protected void onStop() {
     92         Log.i(TAG, "onStop");
     93         super.onStop();
     94     }
     95 
     96     @Override
     97     protected void onRestart() {
     98         Log.i(TAG, "onRestart");
     99         super.onRestart();
    100     }
    101 
    102     @Override
    103     public void onButtonClicked() {
    104         Log.i(TAG, "onButtonClicked");
    105         TextView tv = (TextView) fragment1.getActivity().findViewById(
    106                 R.id.fragment2_tv);
    107         tv.setText(tv.getText() + "
    从Fragment1收到数据!");
    108     }
    109 }
    View Code

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

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

      三、源码下载

        点我下载,下载源码导入工程就可以使用了!

      接下来可能会介绍一下Fragment的动画效果,有兴趣的可以关注一下。我的CSDN博客:http://blog.csdn.net/u010049692/article/details/38979607

  • 相关阅读:
    【BZOJ】【1412】【ZJOI2009】狼和羊的故事
    【POJ】【2987】Firing
    【BZOJ】【1324】王者之剑
    【POJ】【2125】Destroying the Graph
    bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)
    bzoj3810: [Coci2015]Stanovi(记忆化搜索)
    bzoj2120: 数颜色(BIT套主席树+set/分块)
    bzoj2144: 跳跳棋(二分/倍增)
    bzoj4552: [Tjoi2016&Heoi2016]排序(二分+线段树)
    bzoj4773: 负环(倍增floyd)
  • 原文地址:https://www.cnblogs.com/getherBlog/p/3949171.html
Copyright © 2011-2022 走看看