大佬教程收集整理的这篇文章主要介绍了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,请注明来意。