简介:Fragment是一个类,不能单独存在只能依附在Activity上才能运行,属于Activity一个界面的一部分,不能单独运行。一个Activity的界面可以由完全不同的Fragment组成,Fragment有自己的生命周期和接收、处理用户的事件,因此不必要在一个Activity里面写一堆事件、控件的代码了。可以静态、动态的添加、替换、移除某个Fragment。
Fragment和Activity之间的通信(回掉方法):
1.在Fragment中声明一个接口
2.在A中实现在F中声明的接口
3.在F中声明一个接口的对象
4.在F的生命周期Onattach方法中判断当前A是否实现了此F中
声明的接口。如果已实现,就把当前A装换成接口对象。
5.调用A中的实现的方法 =>(接口对象.方法名)
package com.edu.jereh.jreduch08; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import com.edu.jereh.jreduch08.fragment.FirstFragment; import com.edu.jereh.jreduch08.fragment.LeftFragment; import com.edu.jereh.jreduch08.fragment.SecondFragment; public class Fragment1Activity extends AppCompatActivity implements LeftFragment.OnFragmentInteractionListener //实现LeftFragment { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment1); getSupportActionBar().hide(); } public void changeFragment(int which) { if(which==1){ Fragment fragment1 = new FirstFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.fl,fragment1) .commit(); }else if(which==2){ Fragment fragment2 = new SecondFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.fl, fragment2) .commit(); } } }
activity_fragment1 布局文件<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.edu.jereh.jreduch08.Fragment1Activity"> <fragment android:layout_width="100dp" android:layout_height="match_parent" android:id="@+id/left_fragment" android:layout_below="@+id/top_fragment" android:name="com.edu.jereh.jreduch08.fragment.LeftFragment"/> <fragment android:layout_width="match_parent" android:layout_height="100dp" android:id="@+id/top_fragment" android:name="com.edu.jereh.jreduch08.fragment.TopFragment"/> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fl" android:layout_below="@+id/top_fragment" android:layout_toEndOf="@+id/left_fragment"> </FrameLayout> </RelativeLayout>
FirstFragment布局文件
SecondFragment布局文件
LeftFragment代码
package com.edu.jereh.jreduch08.fragment; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; import com.edu.jereh.jreduch08.R; /** * A simple {@link Fragment} subclass. */ public class LeftFragment extends Fragment { private Fragment fragment1; private Fragment fragment2; private OnFragmentInteractionListener mListener; public LeftFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view =inflater.inflate(R.layout.fragment_left, container, false); Button bt1 = (Button)view.findViewById(R.id.bt1); Button bt2 = (Button)view.findViewById(R.id.bt2); Button bt3 = (Button)view.findViewById(R.id.bt3); Button bt4 = (Button)view.findViewById(R.id.bt4); Button bt5 = (Button)view.findViewById(R.id.bt5); Button bt6 = (Button)view.findViewById(R.id.bt6); bt1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fragment1 = new FirstFragment(); Toast.makeText(getContext(),"点击了按钮1",Toast.LENGTH_SHORT).show(); FragmentManager fm = getFragmentManager(); FragmentTransaction fr = fm.beginTransaction();//事物 开始 fr.replace(R.id.fl,fragment1);//执行 fr.commit();//提交 } }); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fragment2 = new SecondFragment(); Toast.makeText(getContext(),"点击了按钮2",Toast.LENGTH_SHORT).show(); FragmentManager fm = getFragmentManager(); FragmentTransaction fr = fm.beginTransaction();//事物 开始 fr.replace(R.id.fl,fragment2);//执行 fr.commit();//提交 } }); bt3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.changeFragment(1); } }); bt4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.changeFragment(2); } }); bt5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(fragment1!=null&&!fragment1.isHidden()){ //判断是否不隐藏 getFragmentManager().beginTransaction() .hide(fragment1) .commit(); } } }); bt6.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(fragment1!=null&&fragment1.isHidden()) { //判断是否隐藏 getFragmentManager().beginTransaction() .show(fragment1) .commit(); } } }); return view; } public interface OnFragmentInteractionListener{ void changeFragment(int which); } public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { //判断A是否实现了F里的接口 mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } public void onDetach() { super.onDetach(); mListener = null; } }
以下6副图以此为点击Button bt1-5后的效果,图三和图四便是用回调方法
Fragment的生命周期
![]()
方法名 说明 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脱离时,调用此函数 与Activity生命周期的对比![]()