Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android利用Fragment实现Tab选项卡效果大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

利用Fragment实现Tab选项卡效果: 

将RadioGroup与Fragment集合,实现tab选项卡效果,这里面最关键的几个文件: 

1.FragmentTabAdapter类:

/**
 *@Description: 
 *@Author:Nate Robinson 
 *@Since:2015-2-12
 */
public class FragmentTabAdapter implements RadioGroup.oncheckedchangelistener
{
 private List<Fragment> fragments; // 一个tab页面对应一个Fragment

 private RadioGroup rgs; // 用于切换tab

 private Activity activity; // Fragment所属的Activity

 privatE int fragmentContentId; // Activity中所要被替换的区域的id

 privatE int currentTab; // 当前Tab页面索引

 private OnRgsExtracheckedChangedListener onRgsExtracheckedChangedListener; // 用于让调用者在切换tab时候增加新的功能

 public FragmentTabAdapter(Activity activity,List<Fragment> fragments,int fragmentContentId,RadioGroup rgs)
 {
  this.fragments = fragments;
  this.rgs = rgs;
  this.activity = activity;
  this.fragmentContentId = fragmentContentId;

  // 显示第一页
  android.app.Fragmenttransaction ft = activity.getFragmentManager().begintransaction();
  ft.add(fragmentContentId,fragments.get(0));
  ft.commit();

  rgs.setOncheckedchangelistener(this);

 }

 @Override
 public void oncheckedChanged(RadioGroup radioGroup,int checkedId)
 {
  for(int i = 0; i < rgs.getChildCount(); i++)
  {
   if(rgs.getChildAt(i).getId() == (checkedId))
   {
    Fragment fragment = fragments.get(i);
    Fragmenttransaction ft = activity.getFragmentManager().begintransaction();
    getCurrentFragment().onPause(); // 暂停当前tab
    // getCurrentFragment().onStop(); // 暂停当前tab

    if(fragment.isAdded())
    {
     // fragment.onStart(); // 启动目标tab的onStart()
     fragment.onResume(); // 启动目标tab的onResume()
    }
    else
    {
     ft.add(fragmentContentId,fragment);
    }
    showTab(i); // 显示目标tab
    ft.commit();

    // 如果设置了切换tab额外功能功能接口
    if(null != onRgsExtracheckedChangedListener)
    {
     onRgsExtracheckedChangedlistener.onRgsExtracheckedChanged(radioGroup,checkedId,i);
    }

   }
  }

 }

 /**
  * 切换tab
  * @param idx
  */
 private void showTab(int idX)
 {
  for(int i = 0; i < fragments.size(); i++)
  {
   Fragment fragment = fragments.get(i);
   Fragmenttransaction ft = activity.getFragmentManager().begintransaction();
   if(idx == i)
   {
    ft.show(fragment);
   }
   else
   {
    ft.hide(fragment);
   }
   ft.commit();
  }
  currentTab = idx; // 更新目标tab为当前tab
 }

 public int getCurrentTab()
 {
  return currentTab;
 }

 public Fragment getCurrentFragment()
 {
  return fragments.get(currentTab);
 }

 public OnRgsExtracheckedChangedListener getOnRgsExtracheckedChangedListener()
 {
  return onRgsExtracheckedChangedListener;
 }

 public void setOnRgsExtracheckedChangedListener(OnRgsExtracheckedChangedListener onRgsExtracheckedChangedListener)
 {
  this.onRgsExtracheckedChangedListener = onRgsExtracheckedChangedListener;
 }

 /**
  * 切换tab额外功能功能接口
  */
 public interface OnRgsExtracheckedChangedListener
 {
  void OnRgsExtracheckedChanged(RadioGroup radioGroup,int checkedId,int indeX);
 }
} 

2.activity_main.xml布局文件

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://scheR_604_11845@as.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:BACkground="@android:color/white"
 android:orientation="vertical" >

 <LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >

  <FrameLayout
   android:id="@+id/tab_content"
   android:layout_width="fill_parent"
   android:layout_height="0dp"
   android:layout_weight="1.0"
   android:BACkground="#77557799" />

  <RadioGroup
   android:id="@+id/tabs_rg"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:gravity="center"
   android:orientation="horizontal"
   android:paddingBottom="7dp"
   android:paddingTop="7dp" >

   <RadioButton
    android:id="@+id/tab_rb_a"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1.0"
    android:BACkground="@drawable/SELEctor_tab"
    android:button="@null"
    android:checked="true"
    android:drawableTop="@drawable/tablatestalert"
    android:gravity="center"
    android:singleLine="true"
    android:text="Tab1"
    android:textColor="#000000"
    android:textSize="13sp" />

   <RadioButton
    android:id="@+id/tab_rb_b"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1.0"
    android:BACkground="@drawable/SELEctor_tab"
    android:button="@null"
    android:drawableTop="@drawable/tabsearch"
    android:gravity="center"
    android:singleLine="true"
    android:text="Tab2"
    android:textColor="#000000"
    android:textSize="13sp" />

   <RadioButton
    android:id="@+id/tab_rb_c"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1.0"
    android:BACkground="@drawable/SELEctor_tab"
    android:button="@null"
    android:drawableTop="@drawable/tabrecommd"
    android:gravity="center"
    android:singleLine="true"
    android:text="Tab3"
    android:textColor="#000000"
    android:textSize="13sp" />
  </RadioGroup>
 </LinearLayout>

</LinearLayout>

3.MainActivity类:

/**
 *@Description: 
 *@Author:Nate Robinson 
 *@Since:2015-2-12
 */
public class MainActivity extends Activity
{
 private RadioGroup rgs;

 private List<Fragment> fragments = new ArrayList<Fragment>();

 privatE int index;

 private static Boolean isExit = false;

 private static Boolean hasTask = false;

 private RadioButton button;

 private Timer tExit = new Timer();

 private TimerTask task = new TimerTask()
 {
  @Override
  public void run()
  {
   isExit = false;
   hasTask = true;
  }
 };

 private FragmentTabAdapter tabAdapter;

 @Override
 public void onCreate(Bundle savedInstanceStatE)
 {
  super.onCreate(savedInstanceStatE);
  setContentView(R.layout.activity_main);

  fragments.add(new FragmentOne());
  fragments.add(new FragmentTwo());
  fragments.add(new FragmentThree());

  rgs = (RadioGroup) findViewById(R.id.tabs_rg);

  button = (RadioButton) findViewById(R.id.tab_rb_a);

  tabAdapter = new FragmentTabAdapter(this,fragments,R.id.tab_content,rgs);
  tabAdapter.setOnRgsExtracheckedChangedListener(new FragmentTabAdapter.onRgsExtracheckedChangedListener()
  {
   @Override
   public void OnRgsExtracheckedChanged(RadioGroup radioGroup,int indeX)
   {
    // 利用这个index可以实现,如果不是在主页,按第一遍让它先跳转到第一个Fragment
    System.out.println("Extra---- " + index + " checked!!! ");
    MainActivity.this.index = index;
   }
  });
 }

 @Override
 public Boolean onKeyDown(int keyCode,KeyEvent event)
 {
  if(keyCode == KeyEvent.KEYCODE_BACK)
  {
   if(index == 0)
   {
    if(isExit == falsE)
    {
     isExit = true;
     Toast.makeText(MainActivity.this,"再按一次退出程序",Toast.LENGTH_SHORT).show();
     if(!hasTask)
     {
      tExit.schedule(task,1000);
     }
    }
    else
    {
     finish();
     System.exit(0);
    }
   }
   else
   {
    // 如果不是在主页,按第一遍让它先跳转到第一个Fragment
    // 利用上面的check方法会导致oncheckedChanged方法被执行多次
    // rgs.check(button.getId());
    button.setchecked(true);
   }

  }
  return false;
 }
}

为了能同时学习Fragment生命周期,我在Fragment每个生命周期方法中加入了log打印,一个有三个这样的Fragment,我只贴出其中一个代码,其余和这个一样:

/**
 *@Description: 
 *@Author:Nate Robinson 
 *@Since:2015-2-12
 */
public class FragmentOne extends BaseFragment
{

 private View view;
 

 @Override
 public void onAttach(Activity activity)
 {
  super.onAttach(activity);
  Log.d(tag,"1==>FragmentOne=>onAttach");
 }

 @Override
 public void onCreate(Bundle savedInstanceStatE)
 {
  Log.d(tag,"2==>FragmentOne==>onCreate");
  super.onCreate(savedInstanceStatE);
 }

 @Override
 public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceStatE)
 {
  Log.d(tag,"3==>FragmentOne==>onCreateView");
  view = inflater.inflate(R.layout.fragment1,container,falsE);
  TextView tv = (TextView) view.findViewById(R.id.tv);
  tv.setText("FragmentOne");
  return view;
 }

 @Override
 public void onActivityCreated(Bundle savedInstanceStatE)
 {
  Log.d(tag,"4==>FragmentOne==>onActivityCreated");
  super.onActivityCreated(savedInstanceStatE);
 }

 @Override
 public void onStart()
 {
  Log.d(tag,"5==>FragmentOne==>onStart");
  super.onStart();
 }

 @Override
 public void onResume()
 {
  Log.d(tag,"6==>FragmentOne==>onResume");
  super.onResume();
 }

 @Override
 public void onPause()
 {
  Log.d(tag,"7==>FragmentOne==>onPause");
  super.onPause();
 }

 @Override
 public void onStop()
 {
  Log.d(tag,"8==>FragmentOne==>onStop");
  super.onStop();
 }

 @Override
 public void onDestroyView()
 {
  Log.d(tag,"9==>FragmentOne==>onDestroyView");
  super.onDestroyView();
 }

 @Override
 public void onDestroy()
 {
  Log.d(tag,"10==>FragmentOne==>onDestroy");
  super.onDestroy();
 }

 @Override
 public void onDetach()
 {
  Log.d(tag,"11==>FragmentOne==>onDetach");
  super.onDetach();
 }

 @Override
 public void onViewCreated(View view,Bundle savedInstanceStatE)
 {

  Log.d(tag,"FragmentOne==>onViewCreated");
  super.onViewCreated(view,savedInstanceStatE);
 }
}

在编写过程中,我为了实现如果不是在主页,按第一遍让它先跳转到第一个Fragment这个效果,一开始使用了rgs.check(button.getId());这个方法,结果发现,这样的话oncheckedChanged监听事件会执行两次,后来改为button.setchecked(true);这个方法之后,成功解决了这个问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

大佬总结

以上是大佬教程为你收集整理的Android利用Fragment实现Tab选项卡效果全部内容,希望文章能够帮你解决Android利用Fragment实现Tab选项卡效果所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:选项卡