Android Fragment 真正的完全解析(3)

@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState)
 {
  View view = inflater.inflate(R.layout.fragment_one, container, false);
  mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);
  mBtn.setOnClickListener(this);
  return view;
 }

/**
  * 交给宿主Activity处理,如果它希望处理
  */
 @Override
 public void onClick(View v)
 {
  if (getActivity() instanceof FOneBtnClickListener)
  {
   ((FOneBtnClickListener) getActivity()).onFOneBtnClick();
  }
 }

}

可以看到���在的FragmentOne不和任何Activity耦合,任何Activity都可以使用;并且我们声明了一个接口,来回调其点击事件,想要管理其点击事件的Activity实现此接口就即可。可以看到我们在onClick中首先判断了当前绑定的Activity是否实现了该接口,如果实现了则调用。

再看FragmentTwo

package com.zhy.zhy_fragments;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class FragmentTwo extends Fragment implements OnClickListener
{


 private Button mBtn ;
 
 private FTwoBtnClickListener fTwoBtnClickListener ;
 
 public interface FTwoBtnClickListener
 {
  void onFTwoBtnClick();
 }
 //设置回调接口
 public void setfTwoBtnClickListener(FTwoBtnClickListener fTwoBtnClickListener)
 {
  this.fTwoBtnClickListener = fTwoBtnClickListener;
 }
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState)
 {
  View view = inflater.inflate(R.layout.fragment_two, container, false);
  mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);
  mBtn.setOnClickListener(this);
  return view ;
 }
 @Override
 public void onClick(View v)
 {
  if(fTwoBtnClickListener != null)
  {
   fTwoBtnClickListener.onFTwoBtnClick();
  }
 }

}

与FragmentOne极其类似,但是我们提供了setListener这样的方法,意味着Activity不仅需要实现该接口,还必须显示调用mFTwo.setfTwoBtnClickListener(this)。

最后看Activity :

package com.zhy.zhy_fragments;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Window;

import com.zhy.zhy_fragments.FragmentOne.FOneBtnClickListener;
import com.zhy.zhy_fragments.FragmentTwo.FTwoBtnClickListener;

public class MainActivity extends Activity implements FOneBtnClickListener,
  FTwoBtnClickListener
{

private FragmentOne mFOne;
 private FragmentTwo mFTwo;
 private FragmentThree mFThree;

@Override
 protected void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_main);

mFOne = new FragmentOne();
  FragmentManager fm = getFragmentManager();
  FragmentTransaction tx = fm.beginTransaction();
  tx.add(R.id.id_content, mFOne, "ONE");
  tx.commit();
 }

/**
  * FragmentOne 按钮点击时的回调
  */
 @Override
 public void onFOneBtnClick()
 {

if (mFTwo == null)
  {
   mFTwo = new FragmentTwo();
   mFTwo.setfTwoBtnClickListener(this);
  }
  FragmentManager fm = getFragmentManager();
  FragmentTransaction tx = fm.beginTransaction();
  tx.replace(R.id.id_content, mFTwo, "TWO");
  tx.addToBackStack(null);
  tx.commit();
 }

/**
  * FragmentTwo 按钮点击时的回调
  */
 @Override
 public void onFTwoBtnClick()
 {
  if (mFThree == null)
  {
   mFThree = new FragmentThree();

}
  FragmentManager fm = getFragmentManager();
  FragmentTransaction tx = fm.beginTransaction();
  tx.hide(mFTwo);
  tx.add(R.id.id_content, mFThree, "THREE");
  // tx.replace(R.id.id_content, fThree, "THREE");
  tx.addToBackStack(null);
  tx.commit();
 }

}

代码重构结束,与开始的效果一模一样。上面两种通信方式都是值得推荐的,随便选择一种自己喜欢的。这里再提一下:虽然Fragment和Activity可以通过getActivity与findFragmentByTag或者findFragmentById,进行任何操作,甚至在Fragment里面操作另外的Fragment,但是没有特殊理由是绝对不提倡的。Activity担任的是Fragment间类似总线一样的角色,应当由它决定Fragment如何操作。另外虽然Fragment不能响应Intent打开,但是Activity可以,Activity可以接收Intent,然后根据参数判断显示哪个Fragment。

4、如何处理运行时配置发生变化

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3bd7bf90a93a91ebdc36edcde2b1c4df.html