首页 > 代码库 > FragmentActivity与Fragment两者交互方法简介(转)

FragmentActivity与Fragment两者交互方法简介(转)

FragmentActivity与Fragment两者交互方法简介

分类: Fragment
在Android4.0后很多时候我们会大量使用到Fragment,Fragment与Activity的交互应该来说是非常重要的,但目前很多实例方法都只介绍了Fragment与Activity交互的方法,没有Activity与Fragment交互的方法,下面我来把解决的思路记录如下。
  1.首先我需要定义一个公共接口,用于将Fragment与FragmentActivity中的控件进行交互  

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public interface IBtnCallListener {  
  2.   
  3.   public void transfermsg();  
  4.   }  
public interface IBtnCallListener {  public void transfermsg();  }

 

2.当fragment中的Button控件需要与FragmentActivity中的Button控件交互时,在Fragment对应的子类中定义

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class LaunchUIFragment extends Fragment implements   
  2. IBtnCallListener{  
  3.   
  4.   IBtnCallListener mbtnListener;  
  5.   private Button btn_Click;  
  6.   @Override  
  7.   public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  8.   Bundle savedInstanceState) {  
  9.   View rootView = inflater.inflate(R.layout.fragment_selection_launch,   
  10. container, false);  
  11.   btn_Click=(Button) rootView.findViewById(R.id.bt_click);  
  12.   btn_Click.setOnClickListener(new OnClickListener() {  
  13.   @Override  
  14.   public void onClick(View v) {  
  15.   // TODO Auto-generated method stub   
  16.   mbtnListener.transfermsg();  
  17.   }  
  18.   });  
  19.   return rootView;  
  20.   }  
  21.   @Override  
  22.   public void onActivityCreated(Bundle savedInstanceState) {  
  23.   // TODO Auto-generated method stub   
  24.   super.onActivityCreated(savedInstanceState);  
  25.   }  
  26.   @Override  
  27.   public void onAttach(Activity activity) {  
  28.   // TODO Auto-generated method stub   
  29.   try {  
  30.   mbtnListener=(IBtnCallListener) activity;  
  31.   } catch (Exception e) {  
  32.   // TODO: handle exception   
  33.   throw new ClassCastException(activity.toString() + "must implement   
  34. mbtnListener");  
  35.   }  
  36.   super.onAttach(activity);  
  37.   }  
  38.   @Override  
  39.   public void transfermsg() {  
  40.   // TODO Auto-generated method stub   
  41.   System.out.println("由Activity传输过来的信息");  
  42.   }  
  43.   }  
public class LaunchUIFragment extends Fragment implements IBtnCallListener{  IBtnCallListener mbtnListener;  private Button btn_Click;  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {  View rootView = inflater.inflate(R.layout.fragment_selection_launch, container, false);  btn_Click=(Button) rootView.findViewById(R.id.bt_click);  btn_Click.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {  // TODO Auto-generated method stub  mbtnListener.transfermsg();  }  });  return rootView;  }  @Override  public void onActivityCreated(Bundle savedInstanceState) {  // TODO Auto-generated method stub  super.onActivityCreated(savedInstanceState);  }  @Override  public void onAttach(Activity activity) {  // TODO Auto-generated method stub  try {  mbtnListener=(IBtnCallListener) activity;  } catch (Exception e) {  // TODO: handle exception  throw new ClassCastException(activity.toString() + "must implement mbtnListener");  }  super.onAttach(activity);  }  @Override  public void transfermsg() {  // TODO Auto-generated method stub  System.out.println("由Activity传输过来的信息");  }  }

 

同时在FragmentActivity中对应相应

  

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class MainActivity extends FragmentActivity implements   
  2. IBtnCallListener{  
  3.   
  4.   public static final String ARGUMENTS_NAME = "arg";  
  5.   private RelativeLayout rl_nav;  
  6.   private SyncHorizontalScrollView mHsv;  
  7.   private RadioGroup rg_nav_content;  
  8.   private ImageView iv_nav_indicator;  
  9.   private ImageView iv_nav_left;  
  10.   private ImageView iv_nav_right;  
  11.   private ViewPager mViewPager;  
  12.   private int indicatorWidth;  
  13.   public static String[] tabTitle = { "选项1", "选项2", "选项3", "选项4", "选项5" };   
  14. //标题   
  15.   private LayoutInflater mInflater;  
  16.   private TabFragmentPagerAdapter mAdapter;  
  17.   private int currentIndicatorLeft = 0;  
  18.   private Button Btn_Test;  
  19.   @Override  
  20.   protected void onCreate(Bundle savedInstanceState) {  
  21.   super.onCreate(savedInstanceState);  
  22.   setContentView(R.layout.activity_main);  
  23.   findViewById();  
  24.   initView();  
  25.   setListener();  
  26.   }  
  27.   /* 
  28.   private void setListener() { 
  29.   mViewPager.setOnPageChangeListener(new OnPageChangeListener() { 
  30.   @Override 
  31.   public void onPageSelected(int position) { 
  32.   if(rg_nav_content!=null &&  
  33. rg_nav_content.getChildCount()>position){ 
  34.   ((RadioButton)rg_nav_content.getChildAt(position)).performClick(); 
  35.   } 
  36.   } 
  37.   @Override 
  38.   public void onPageScrolled(int arg0, float arg1, int arg2) { 
  39.   } 
  40.   @Override 
  41.   public void onPageScrollStateChanged(int arg0) { 
  42.   } 
  43.   }); 
  44.   rg_nav_content.setOnCheckedChangeListener(new OnCheckedChangeListener()  
  45.   @Override 
  46.   public void onCheckedChanged(RadioGroup group, int checkedId) { 
  47.   if(rg_nav_content.getChildAt(checkedId)!=null){ 
  48.   TranslateAnimation animation = new TranslateAnimation( 
  49.   currentIndicatorLeft , 
  50.   ((RadioButton) rg_nav_content.getChildAt(checkedId)).getLeft(), 0f,  
  51. 0f); 
  52.   animation.setInterpolator(new LinearInterpolator()); 
  53.   animation.setDuration(100); 
  54.   animation.setFillAfter(true); 
  55.   //执行位移动画 
  56.   iv_nav_indicator.startAnimation(animation); 
  57.   mViewPager.setCurrentItem(checkedId); //ViewPager 跟随一起 切换 
  58.   //记录当前 下标的距最左侧的 距离 
  59.   currentIndicatorLeft = ((RadioButton)  
  60. rg_nav_content.getChildAt(checkedId)).getLeft(); 
  61.   mHsv.smoothScrollTo( 
  62.   (checkedId > 1 ? ((RadioButton)  
  63. rg_nav_content.getChildAt(checkedId)).getLeft() : 0) - ((RadioButton)  
  64. rg_nav_content.getChildAt(2)).getLeft(), 0); 
  65.   } 
  66.   } 
  67.   }); 
  68.   } 
  69.   private void initView() { 
  70.   DisplayMetrics dm = new DisplayMetrics(); 
  71.   getWindowManager().getDefaultDisplay().getMetrics(dm); 
  72.   indicatorWidth = dm.widthPixels / 4; 
  73.   LayoutParams cursor_Params = iv_nav_indicator.getLayoutParams(); 
  74.   cursor_Params.width = indicatorWidth;// 初始化滑动下标的宽 
  75.   iv_nav_indicator.setLayoutParams(cursor_Params); 
  76.   mHsv.setSomeParam(rl_nav, iv_nav_left, iv_nav_right, this); 
  77.   //获取布局填充器 
  78.   mInflater =  
  79. (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE); 
  80.   //另一种方式获取 
  81.   // LayoutInflater mInflater = LayoutInflater.from(this); 
  82.   initNavigationHSV(); 
  83.   mAdapter = new TabFragmentPagerAdapter(getSupportFragmentManager()); 
  84.   mViewPager.setAdapter(mAdapter); 
  85.   Btn_Test=(Button) findViewById(R.id.btn_test); 
  86.   Btn_Test.setOnClickListener(new OnClickListener() { 
  87.   @Override 
  88.   public void onClick(View v) { 
  89.   // TODO Auto-generated method stub 
  90.   mBtnCallListener.transfermsg(); 
  91.   } 
  92.   }); 
  93.   } 
  94.   */  
  95.   private IBtnCallListener mBtnCallListener;  
  96.   @Override  
  97.   public void onAttachFragment(Fragment fragment) {  
  98.   // TODO Auto-generated method stub   
  99.   try {  
  100.   mBtnCallListener=(IBtnCallListener) fragment;  
  101.   } catch (Exception e) {  
  102.   // TODO: handle exception   
  103.   }  
  104.   super.onAttachFragment(fragment);  
  105.   }  
  106.   @Override  
  107.   public void transfermsg() {  
  108.   // TODO Auto-generated method stub   
  109.   System.out.println("由Fragment传输过来的信息");  
  110.   }  
  111.   /* 
  112.   private void initNavigationHSV() { 
  113.   rg_nav_content.removeAllViews(); 
  114.   for(int i=0;i  
  115.   RadioButton rb = (RadioButton)  
  116. mInflater.inflate(R.layout.nav_radiogroup_item, null); 
  117.   rb.setId(i); 
  118.   rb.setText(tabTitle[i]); 
  119.   rb.setLayoutParams(new LayoutParams(indicatorWidth, 
  120.   LayoutParams.MATCH_PARENT)); 
  121.   rg_nav_content.addView(rb); 
  122.   } 
  123.   } 
  124.   private void findViewById() { 
  125.   rl_nav = (RelativeLayout) findViewById(R.id.rl_nav); 
  126.   mHsv = (SyncHorizontalScrollView) findViewById(R.id.mHsv); 
  127.   rg_nav_content = (RadioGroup) findViewById(R.id.rg_nav_content); 
  128.   iv_nav_indicator = (ImageView) findViewById(R.id.iv_nav_indicator); 
  129.   iv_nav_left = (ImageView) findViewById(R.id.iv_nav_left); 
  130.   iv_nav_right = (ImageView) findViewById(R.id.iv_nav_right); 
  131.   mViewPager = (ViewPager) findViewById(R.id.mViewPager); 
  132.   } 
  133.   @Override 
  134.   public boolean onCreateOptionsMenu(Menu menu) { 
  135.   getMenuInflater().inflate(R.menu.main, menu); 
  136.   return true; 
  137.   } 
  138.   public static class TabFragmentPagerAdapter extends  
  139. FragmentPagerAdapter{ 
  140.   public TabFragmentPagerAdapter(FragmentManager fm) { 
  141.   super(fm); 
  142.   } 
  143.   @Override 
  144.   public Fragment getItem(int arg0) { 
  145.   Fragment ft = null; 
  146.   switch (arg0) { 
  147.   case 0: 
  148.   ft = new LaunchUIFragment(); 
  149.   break; 
  150.   default: 
  151.   ft = new CommonUIFragment(); 
  152.   Bundle args = new Bundle(); 
  153.   args.putString(ARGUMENTS_NAME, tabTitle[arg0]); 
  154.   ft.setArguments(args); 
  155.   break; 
  156.   } 
  157.   return ft; 
  158.   } 
  159.   @Override 
  160.   public int getCount() { 
  161.   return tabTitle.length; 
  162.   } 
  163.   }*/  
  164.   }  
public class MainActivity extends FragmentActivity implements IBtnCallListener{  public static final String ARGUMENTS_NAME = "arg";  private RelativeLayout rl_nav;  private SyncHorizontalScrollView mHsv;  private RadioGroup rg_nav_content;  private ImageView iv_nav_indicator;  private ImageView iv_nav_left;  private ImageView iv_nav_right;  private ViewPager mViewPager;  private int indicatorWidth;  public static String[] tabTitle = { "选项1", "选项2", "选项3", "选项4", "选项5" }; //标题  private LayoutInflater mInflater;  private TabFragmentPagerAdapter mAdapter;  private int currentIndicatorLeft = 0;  private Button Btn_Test;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  findViewById();  initView();  setListener();  }  /*  private void setListener() {  mViewPager.setOnPageChangeListener(new OnPageChangeListener() {  @Override  public void onPageSelected(int position) {  if(rg_nav_content!=null && rg_nav_content.getChildCount()>position){  ((RadioButton)rg_nav_content.getChildAt(position)).performClick();  }  }  @Override  public void onPageScrolled(int arg0, float arg1, int arg2) {  }  @Override  public void onPageScrollStateChanged(int arg0) {  }  });  rg_nav_content.setOnCheckedChangeListener(new OnCheckedChangeListener() {  @Override  public void onCheckedChanged(RadioGroup group, int checkedId) {  if(rg_nav_content.getChildAt(checkedId)!=null){  TranslateAnimation animation = new TranslateAnimation(  currentIndicatorLeft ,  ((RadioButton) rg_nav_content.getChildAt(checkedId)).getLeft(), 0f, 0f);  animation.setInterpolator(new LinearInterpolator());  animation.setDuration(100);  animation.setFillAfter(true);  //执行位移动画  iv_nav_indicator.startAnimation(animation);  mViewPager.setCurrentItem(checkedId); //ViewPager 跟随一起 切换  //记录当前 下标的距最左侧的 距离  currentIndicatorLeft = ((RadioButton) rg_nav_content.getChildAt(checkedId)).getLeft();  mHsv.smoothScrollTo(  (checkedId > 1 ? ((RadioButton) rg_nav_content.getChildAt(checkedId)).getLeft() : 0) - ((RadioButton) rg_nav_content.getChildAt(2)).getLeft(), 0);  }  }  });  }  private void initView() {  DisplayMetrics dm = new DisplayMetrics();  getWindowManager().getDefaultDisplay().getMetrics(dm);  indicatorWidth = dm.widthPixels / 4;  LayoutParams cursor_Params = iv_nav_indicator.getLayoutParams();  cursor_Params.width = indicatorWidth;// 初始化滑动下标的宽  iv_nav_indicator.setLayoutParams(cursor_Params);  mHsv.setSomeParam(rl_nav, iv_nav_left, iv_nav_right, this);  //获取布局填充器  mInflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);  //另一种方式获取  // LayoutInflater mInflater = LayoutInflater.from(this);  initNavigationHSV();  mAdapter = new TabFragmentPagerAdapter(getSupportFragmentManager());  mViewPager.setAdapter(mAdapter);  Btn_Test=(Button) findViewById(R.id.btn_test);  Btn_Test.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {  // TODO Auto-generated method stub  mBtnCallListener.transfermsg();  }  });  }  */  private IBtnCallListener mBtnCallListener;  @Override  public void onAttachFragment(Fragment fragment) {  // TODO Auto-generated method stub  try {  mBtnCallListener=(IBtnCallListener) fragment;  } catch (Exception e) {  // TODO: handle exception  }  super.onAttachFragment(fragment);  }  @Override  public void transfermsg() {  // TODO Auto-generated method stub  System.out.println("由Fragment传输过来的信息");  }  /*  private void initNavigationHSV() {  rg_nav_content.removeAllViews();  for(int i=0;i   RadioButton rb = (RadioButton) mInflater.inflate(R.layout.nav_radiogroup_item, null);  rb.setId(i);  rb.setText(tabTitle[i]);  rb.setLayoutParams(new LayoutParams(indicatorWidth,  LayoutParams.MATCH_PARENT));  rg_nav_content.addView(rb);  }  }  private void findViewById() {  rl_nav = (RelativeLayout) findViewById(R.id.rl_nav);  mHsv = (SyncHorizontalScrollView) findViewById(R.id.mHsv);  rg_nav_content = (RadioGroup) findViewById(R.id.rg_nav_content);  iv_nav_indicator = (ImageView) findViewById(R.id.iv_nav_indicator);  iv_nav_left = (ImageView) findViewById(R.id.iv_nav_left);  iv_nav_right = (ImageView) findViewById(R.id.iv_nav_right);  mViewPager = (ViewPager) findViewById(R.id.mViewPager);  }  @Override  public boolean onCreateOptionsMenu(Menu menu) {  getMenuInflater().inflate(R.menu.main, menu);  return true;  }  public static class TabFragmentPagerAdapter extends FragmentPagerAdapter{  public TabFragmentPagerAdapter(FragmentManager fm) {  super(fm);  }  @Override  public Fragment getItem(int arg0) {  Fragment ft = null;  switch (arg0) {  case 0:  ft = new LaunchUIFragment();  break;  default:  ft = new CommonUIFragment();  Bundle args = new Bundle();  args.putString(ARGUMENTS_NAME, tabTitle[arg0]);  ft.setArguments(args);  break;  }  return ft;  }  @Override  public int getCount() {  return tabTitle.length;  }  }*/  }

 

 其中,主要部分是Fragment需要重写OnAttach方法,将接口对象实例化,同时在Activity要实现对应接口的方法,在该方法中实现你想要的功能,这样就可以由Fragment灵活交互FragmentActivity中的内容与控件了

  同理,FragmentActivity想要交互对应的Fragment也需要重写FragmentActivity的OnAttachFragment方法,同时在
  Fragment中实现对应接口的方法,在该方法中实现你想要的功能,这样就可以由FragmentActivity灵活交互Fragment中的内容与控件了 (主要看没有注释的部分)
  其实,交互的思路都是一样的,全都是通过一个公共的接口调用,在对应的地方实现。

FragmentActivity与Fragment两者交互方法简介(转)