栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

1.FragmentTabAdapter类:


public class FragmentTabAdapter implements RadioGroup.onCheckedChangeListener
{
 private List 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 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);
  }

  }
 }

 }

 
 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;
 }

 
 public interface onRgsExtraCheckedChangedListener
 {
 void onRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index);
 }
} 

2.activity_main.xml布局文件:




 

 

 

  

  

  
 
 


3.MainActivity类:


public class MainActivity extends Activity
{
 private RadioGroup rgs;
 private List fragments = new ArrayList();
 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 checkedId, 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,我只贴出其中一个代码,其余和这个一样:


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);这个方法之后,成功解决了这个问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/161960.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号