你的位置:首页 > 操作系统

[操作系统]Fragment的生命周期和Activity之间的通信以及使用


Fragment通俗来讲就是碎片,不能单独存在,意思就是说必须依附于Activity,一般来说有两种方式把Fragment加到Activity,分为静态,动态。

静态即为右键单击,建立一个Fragment,选择Blank,在Activity布局中直接加fragment,name属性直接指向之前建立的Fragment,这就添加上了Fragment,这种较为简单。

动态:

我们要做的是在Activity中添加一个Fragment,Fragment中有两个按钮,当按下按钮时分别切换不同的Fragment,注意,切换不同的Fragment的代码在Activity中写。

实现Fragment和Activity之间的通信,步骤一般分为五步,1、在Fragment中声明一个接口。 2、在Activity中实现在Fragment中声明的接口。

3、在Fragment中声明一个接口对象。 4、在Fragment的生命周期中onAttach方法中判断当前Activity是否实现了此Fragment中声明的接口

5、调用Activity中实现的方法 (接口对象.方法名)

 

首先,建立一个名为OneFragment的Fragment,在右键单击建立时勾选Include fragment factory methods 和Include interface callback,这样会自动添加相关代码,省掉很多时间.再在新建立的Fragment里添加两个按钮,设置Id。

布局代码如下

<FrameLayout 

android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.homeworepar.Fragment.OneFragment">

<!-- TODO: Update blank fragment layout -->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt1"
android:text="好友"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt2"
android:text="消息"
android:layout_gravity="center_horizontal|top" />

</FrameLayout>


下面为Fragment的代码
package com.example.administrator.homeworepar.Fragment;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.example.administrator.homeworepar.R;

/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link OneFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link OneFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class OneFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public OneFragment() {
// Required empty public constructor
}

/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment OneFragment.
*/
// TODO: Rename and change types and number of parameters
public static OneFragment newInstance(String param1, String param2) {
OneFragment fragment = new OneFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_one, container, false);
Button bt1= (Button) view.findViewById(R.id.bt1); // 实现的功能是的那个按下按钮时,会调用ACtivity中的changFragment方法
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.changFragment(1);
}
});
Button bt2= (Button) view.findViewById(R.id.bt2);
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.changFragment(2);
}
});
return view;
}



@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) { 判断是否实现了接口,如果实现了接 口,就把Activity转换为接口的对 象,这样就可以调用方 法
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}

@Override
public void onDetach() {
super.onDetach();
mListener = null;
}

/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener { // 此段为自动添加的接口,在接口中实现一个方法修改完后会有其他代码出错,只要 把出错代码删掉即可。
// TODO: Update argument type and name
void changFragment(int which);
}
 

再建立一个Activity,

package com.example.administrator.homeworepar.Fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;

import com.example.administrator.homeworepar.R;

public class Fragment2Activity extends AppCompatActivity implements OneFragment.OnFragmentInteractionListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment2);
}
@Override
public void changFragment(int which) {
if(which==1){
Fragment fragment1=new BlankFragment(); //实现Fragment中的方法,当得到的值为1时,把BlankFragment填充 //到Id为fl2中的FrameLayout中,
getSupportFragmentManager()
          .beginTransaction().replace(R.id.fl2,fragment1).commit();
}else if(which==2){
Fragment fragment2=new SecondFragment();
getSupportFragmentManager()
.beginTransaction().replace(R.id.fl2,fragment2).commit();
}
}
}





ACtivity布局代码如下
<?
<RelativeLayout

android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.homeworepar.Fragment.Fragment2Activity">
<fragment
android:layout_width="match_parent"
android:layout_height="50dp"
android:name="com.example.administrator.homeworepar.Fragment.OneFragment"
android:id="@+id/fragment3" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fl2"
android:layout_below="@+id/fragment3">

</FrameLayout>
</RelativeLayout>
这样就可以实现ACtivity与Fragment间的通信,另外Fragment还有和Activity一样还有生命周期的问题

方法名 说明
onAttach () Fragment被附加到Activity的时,调用此函数,在这个方法中可以获得宿主Activity。
onCreate () Fragment被创建的时,调用此函数。
onCreateView () Fragment的布局加载时,调用此函数。
onActivityCreated () 当宿主Activity启动完毕后,调用此函数。
onStart () 启动Fragment时,调用此函数。
onResume () Fragment恢复时,调用此函数。
onPause () Fragment暂停时,调用此函数。
onStop() Fragment停止时,调用此函数。
onDestroyView() 销毁Fragment中的View控件时,调用此函数。
onDestroy() 销毁Fragment时,调用此函数。
onDetach() Fragment从Activity脱离时,调用此函数