zoukankan      html  css  js  c++  java
  • Fragment的生命周期&同一Activity下不同Fragment之间的通信

    Android开发:碎片Fragment完全解析(2)

    Fragment的生命周期

    和Activity一样,Fragment也有自己的生命周期,理解Fragment的生命周期非常重要,我们通过代码的方式来瞧一瞧Fragment的生命周期是什么样的:

     1 publicclass Fragment1 extends Fragment {   
     2 publicstaticfinal String TAG = "Fragment1";   
     3 @Override 
     4 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   
     5         Log.d(TAG, "onCreateView");   
     6 return inflater.inflate(R.layout.fragment1, container, false);   
     7     }   
     8 @Override 
     9 publicvoid onAttach(Activity activity) {   
    10 super.onAttach(activity);   
    11         Log.d(TAG, "onAttach");   
    12     }   
    13 @Override 
    14 publicvoid onCreate(Bundle savedInstanceState) {   
    15 super.onCreate(savedInstanceState);   
    16         Log.d(TAG, "onCreate");   
    17     }   
    18 @Override 
    19 publicvoid onActivityCreated(Bundle savedInstanceState) {   
    20 super.onActivityCreated(savedInstanceState);   
    21         Log.d(TAG, "onActivityCreated");   
    22     }   
    23 @Override 
    24 publicvoid onStart() {   
    25 super.onStart();   
    26         Log.d(TAG, "onStart");   
    27     }   
    28 @Override 
    29 publicvoid onResume() {   
    30 super.onResume();   
    31         Log.d(TAG, "onResume");   
    32     }   
    33 @Override 
    34 publicvoid onPause() {   
    35 super.onPause();   
    36         Log.d(TAG, "onPause");   
    37     }   
    38 @Override 
    39 publicvoid onStop() {   
    40 super.onStop();   
    41         Log.d(TAG, "onStop");   
    42     }   
    43 @Override 
    44 publicvoid onDestroyView() {   
    45 super.onDestroyView();   
    46         Log.d(TAG, "onDestroyView");   
    47     }   
    48 @Override 
    49 publicvoid onDestroy() {   
    50 super.onDestroy();   
    51         Log.d(TAG, "onDestroy");   
    52     }   
    53 @Override 
    54 publicvoid onDetach() {   
    55 super.onDetach();   
    56         Log.d(TAG, "onDetach");   
    57     }   
    58 }   

    可以看到,上面的代码在每个生命周期的方法里都打印了日志,然后我们来运行一下程序,可以看到打印日志如下:

    这时点击一下home键,打印日志如下:

    如果你再重新进入进入程序,打印日志如下:

    然后点击back键退出程序,打印日志如下:

    看到这里,我相信大多数朋友已经非常明白了,因为这和Activity的生命周期太相似了。只是有几个Activity中没有的新方法,这里需要重点介绍一下:

    • onAttach方法:Fragment和Activity建立关联的时候调用。

    • onCreateView方法:为Fragment加载布局时调用。

    • onActivityCreated方法:当Activity中的onCreate方法执行完后调用。

    • onDestroyView方法:Fragment中的布局被移除时调用。

    • onDetach方法:Fragment和Activity解除关联的时候调用。

    Fragment之间进行通信

    通常情况下,Activity都会包含多个Fragment,这时多个Fragment之间如何进行通信就是个非常重要的问题了。我们通过一个例子来看一下,如何在一个Fragment中去访问另一个Fragment的视图。

    还是在第一节代码的基础上修改,首先打开fragment2.xml,在这个布局里面添加一个按钮:

    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#ffff00"> 
    <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="This is fragment 2" 
    android:textColor="#000000" 
    android:textSize="25sp"/> 
    <Button 
    android:id="@+id/button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Get fragment1 text" 
    /> 
    </LinearLayout> 
    

    然后打开fragment1.xml,为TextView添加一个id:

    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00ff00"> 
    <TextView 
    android:id="@+id/fragment1_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="This is fragment 1" 
    android:textColor="#000000" 
    android:textSize="25sp"/> 
    </LinearLayout> 
    

    接着打开Fragment2.java,添加onActivityCreated方法,并处理按钮的点击事件:

    publicclass Fragment2 extends Fragment {   
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   
    return inflater.inflate(R.layout.fragment2, container, false);   
        }   
    @Override 
    publicvoid onActivityCreated(Bundle savedInstanceState) {   
    super.onActivityCreated(savedInstanceState);   
            Button button = (Button) getActivity().findViewById(R.id.button);   
            button.setOnClickListener(new OnClickListener() {   
    @Override 
    publicvoid onClick(View v) {   
                    TextView textView = (TextView) getActivity().findViewById(R.id.fragment1_text);   
                    Toast.makeText(getActivity(), textView.getText(), Toast.LENGTH_LONG).show();   
                }   
            });   
        }   
    }   

    现在运行一下程序,并点击一下fragment2上的按钮,效果如下图所示:

    我们可以看到,在fragment2中成功获取到了fragment1中的视图,并弹出Toast。这是怎么实现的呢?主要都是通过getActivity 这个方法实现的。getActivity方法可以让Fragment获取到关联的Activity,然后再调用Activity的 findViewById方法,就可以获取到和这个Activity关联的其它Fragment的视图了。

  • 相关阅读:
    理解dajngo ORM查询中select_related的作用
    Django 模型层 Meta 选项详解
    token和session的区别
    Python 爬虫 urllib、urllib2、urllib3用法及区别
    linux里面访问一个链接的方法
    scrapy-redis实现全站分布式数据爬取
    linux shell 操作 mysql命令(不进入mysql操作界面)
    后台+下载(wget)+多个下载url
    维基下载页面说明(指南)
    pytorch --Rnn语言模型(LSTM,BiLSTM) -- 《Recurrent neural network based language model》
  • 原文地址:https://www.cnblogs.com/rainey-forrest/p/3782350.html
Copyright © 2011-2022 走看看