zoukankan      html  css  js  c++  java
  • FragmentActivity与Fragment两者交互方法简介(转)

    FragmentActivity与Fragment两者交互方法简介

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

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

    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中对应相应

      

    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中的内容与控件了 (主要看没有注释的部分)
      其实,交互的思路都是一样的,全都是通过一个公共的接口调用,在对应的地方实现。
  • 相关阅读:
    sublime Text3 常用插件
    No input file specified. nginx服务器报错解决
    has~和belongsTo的区别?
    关于在phpStudy环境下,windows cmd中 php不是内部命令问题
    spring @RequestMapping注解技巧
    VIM快捷键
    Thinkphp5 模块的自动生成
    在php中define和const定义常量的区别
    go语言学习(六)——并发编程
    go语言学习(五)——面向对象编程
  • 原文地址:https://www.cnblogs.com/qingchen1984/p/3998460.html
Copyright © 2011-2022 走看看