Fragment和Activity之间的通信(回掉方法)
1.在Fragment中声明一个接口
2.在A中实现在F中声明的接口
3.在F中声明一个接口的对象
4.在F的生命周期Onattach方法中判断当前A是否实现了此F中
声明的接口。如果已实现,就把当前A装换成接口对象。
5.调用A中的实现的方法 =>(接口对象.方法名)
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>
FristFragment布局
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-6的效果,bt3,bt4用了回调方法
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生命周期的对比