日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android 动态Tab分页效果实现

發(fā)布時(shí)間:2025/7/14 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 动态Tab分页效果实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? 當(dāng)前項(xiàng)目使用的是TabHost+Activity進(jìn)行分頁(yè),目前要做個(gè)報(bào)表功能,需要在一個(gè)Tab頁(yè)內(nèi)進(jìn)行Activity的切換。比方說(shuō)我有4個(gè)Tab頁(yè)分別為T(mén)ab1,Tab2,Tab3,Tab4,現(xiàn)在的需求是需要將Tab1內(nèi)的Activity動(dòng)態(tài)切換。找了很多資料最終使用了ActivityGroup解決了問(wèn)題,在這過(guò)程中順便嘗試了一下使用Fragment+FragmentActivity+TabHost和Fragment+FragmentActivity+ActionBar試圖淘汰掉舊版的ActivityGroup和TabHost,但是發(fā)現(xiàn)如果要使用Fragment,我需要修改已有的各個(gè)Tab頁(yè)內(nèi)的Activity,工作量較大,而使用ActionBar還有著許多版本兼容性問(wèn)題,并且ActionBar不支持多層嵌套,最終放棄。現(xiàn)在寫(xiě)一下我個(gè)人實(shí)驗(yàn)用的TabHost+ActivityGroup、Fragment+FragmentActivity+TabHost和Fragment+FragmentActivity+ActionBar的Demo,供參考。

? ?首先是TabHost+ActivityGroup。在最初的想法中,我是使用通過(guò)清空TabHost現(xiàn)有內(nèi)容,再添加新內(nèi)容來(lái)實(shí)現(xiàn)動(dòng)態(tài)加載Tab頁(yè)效果,具體代碼不說(shuō)了,舉個(gè)例子:我有4個(gè)Tab頁(yè)分別為T(mén)ab1、Tab2、Tab3和Tab4,存放4個(gè)Activity分別為T(mén)ab1Activity、Tab2Activity、Tab3Activity和Tab4Activity,現(xiàn)在我需要將Tab1位置的Tab1Activity變成Tab5Activity,我的做法是先全部清空,然后重新添加Tab1、Tab2、Tab3和Tab4,在添加的時(shí)候,將Tab1指向的Activity變成Tab5Activity。這種方法無(wú)疑是非常蠢得,而且在這一切換之后,會(huì)發(fā)現(xiàn)Ta5Activity的生命周期出現(xiàn)異常,每次在Tab1和其他Tab之間切換時(shí),Ta5Activity都會(huì)被destroy掉重新create。這個(gè)問(wèn)題我至今沒(méi)找到原因。

? ?然后找到了ActivityGroup。ActivityGroup也是繼承至Activity類(lèi),可以看成是一個(gè)Actvity的容器類(lèi)。 以上面的例子為例,當(dāng)我們把ActivityGroup放入Tab1內(nèi)時(shí),我們就可以通過(guò)管理ActivityGroup來(lái)達(dá)到動(dòng)態(tài)切換Activity的效果,貼上ActivityGroup的代碼:

public class ActivityGroup1 extends ActivityGroup {private ScrollView container = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout);//存放Activity的容器container = (ScrollView) findViewById(R.id.containerBody);// 模塊1ImageView btnModule1 = (ImageView) findViewById(R.id.btnModule1);btnModule1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//清空容器內(nèi)現(xiàn)有內(nèi)容 container.removeAllViews();//加載activity container.addView(getLocalActivityManager().startActivity("Module1",new Intent(ActivityGroup1.this, Tab1Activity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView());}});// 模塊2ImageView btnModule2 = (ImageView) findViewById(R.id.btnModule2);btnModule2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {container.removeAllViews();container.addView(getLocalActivityManager().startActivity("Module2",new Intent(ActivityGroup1.this, Tab2Activity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView());}});// 模塊3ImageView btnModule3 = (ImageView) findViewById(R.id.btnModule3);btnModule3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {container.removeAllViews();container.addView(getLocalActivityManager().startActivity("Module3",new Intent(ActivityGroup1.this, Tab3Activity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView());}});} }

layout.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent" android:orientation="vertical"android:layout_height="fill_parent"><LinearLayout android:gravity="center_horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"><TextView android:id="@+id/cust_title" android:textColor="@android:color/white"android:textSize="28sp" android:text="模塊1" android:layout_width="wrap_content"android:layout_height="wrap_content"></TextView></LinearLayout><!-- 中間動(dòng)態(tài)加載View --><ScrollView android:measureAllChildren="true" android:id="@+id/containerBody"android:layout_weight="1" android:layout_height="fill_parent"android:layout_width="fill_parent"></ScrollView><LinearLayout android:background="@android:color/black"android:layout_gravity="bottom" android:orientation="horizontal"android:layout_width="fill_parent" android:layout_height="wrap_content"><!-- 功能模塊按鈕1 --><ImageView android:id="@+id/btnModule1" android:src="@android:drawable/ic_dialog_dialer"android:layout_marginLeft="7dp" android:layout_marginTop="3dp"android:layout_marginBottom="3dp" android:layout_width="wrap_content"android:layout_height="wrap_content" /><!-- 功能模塊按鈕2 --><ImageView android:id="@+id/btnModule2" android:src="@android:drawable/ic_dialog_info"android:layout_marginLeft="7dp" android:layout_marginTop="3dp"android:layout_marginBottom="3dp" android:layout_width="wrap_content"android:layout_height="wrap_content" /><!-- 功能模塊按鈕3 --><ImageView android:id="@+id/btnModule3" android:src="@android:drawable/ic_dialog_alert"android:layout_marginLeft="7dp" android:layout_marginTop="3dp"android:layout_marginBottom="3dp" android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout> </LinearLayout>

在TabHost中的調(diào)用方式和普通的activity一樣

TabSpec tabSpec=mtabHost.newTabSpec("1").setIndicator("TAB1").setContent(new Intent(this, FragmentActivity1.class));mtabHost.addTab(tabSpec);

這樣通過(guò)點(diǎn)擊三個(gè)按鈕就能達(dá)到動(dòng)態(tài)切換Activity的效果了。

順便說(shuō)下,當(dāng)ActivityGroup內(nèi)嵌套Activity時(shí),Activity的生命周期跟TabHost內(nèi)嵌套Activity一樣。具體的百度。

? ? ?較新的版本中TabHost和ActivityGroup都已經(jīng)被淘汰了,取而代之的是FragmentActivity+Fragment。但我很疑惑Fragment是否真能完全取代ActivityGroup的效果。就拿上述功能來(lái)說(shuō),我要想使用FragmentActivity替換ActivityGroup,那么我現(xiàn)有的Activity就必須重寫(xiě),改裝成Fragment。這種情況下,我在其他地方要使用這些Activity該怎么辦呢?我沒(méi)找到如何使用Fragment裝載Activity的辦法,所以暫時(shí)就沒(méi)法用FragmentActivity替代ActivityGroup了。貼下使用FragmentActivity+Fragment+TabHost的實(shí)現(xiàn)代碼:

Fragment1Activity:

public class FragmentActivity1 extends FragmentActivity{public static FragmentManager fm;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_acitivity_1);fm = getSupportFragmentManager();// 只當(dāng)容器,主要內(nèi)容已Fragment呈現(xiàn)initFragment(new Fragment1());}/*** */// 切換Fragmentpublic static void changeFragment(Fragment f){changeFragment(f, false);}// 初始化Fragment(FragmentActivity中呼叫)public static void initFragment(Fragment f){changeFragment(f, true);}private static void changeFragment(Fragment f, boolean init){FragmentTransaction ft = fm.beginTransaction();ft.replace(R.id.simple_fragment, f);if(!init)ft.addToBackStack(null);ft.commit();} }

這里的FragmentActivity1并不顯示具體內(nèi)容,只做Fragment得容器使用,具體顯示內(nèi)容通過(guò)調(diào)用changeFragment方法動(dòng)態(tài)加載。

Fragment1和Fragment2的代碼如下,點(diǎn)擊按鈕兩者互相切換:

public class Fragment1 extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View v = inflater.inflate(R.layout.fragment1, container, false);Button tv = (Button)v.findViewById(R.id.button2);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 直接呼叫FragmentActivity1的靜態(tài)方法來(lái)做切換FragmentActivity1.changeFragment(new Fragment2());}});return v;} } public class Fragment2 extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View v = inflater.inflate(R.layout.fragment2, container, false);Button tv = (Button)v.findViewById(R.id.button2);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 直接呼叫FragmentActivity1的靜態(tài)方法來(lái)做切換FragmentActivity1.changeFragment(new Fragment1());}});return v;} }

同樣,在TabHost添加中跟普通的Activity一樣:

TabSpec tabSpec=mtabHost.newTabSpec("1").setIndicator("TAB1").setContent(new Intent(this, FragmentActivity1.class));mtabHost.addTab(tabSpec);

這三者的layout都很簡(jiǎn)單,就不寫(xiě)了。對(duì)比ActivityGroup方法發(fā)現(xiàn),其實(shí)兩者實(shí)現(xiàn)思路是一樣的,都是先用一個(gè)“容器”(ActivityGroup和FragmentActivity)占住Tab1的位置,然后每次相應(yīng)時(shí),通過(guò)改變“容器”內(nèi)的元素來(lái)達(dá)到動(dòng)態(tài)改變的效果,區(qū)別就是ActivityGroup存放的是Activity,而FragmentActivity存放的是Fragment。(本人目前已經(jīng)知道可以將Fragment嵌套到Activity中,是否有方法可以將Activity嵌套到Fragment中呢?那么就可以達(dá)到兩個(gè)方法的完全兼容了,而不用像我我擔(dān)心的,需要改造目前已有的Activity成Fragment來(lái)達(dá)到使用FragmentActivity替換ActivityGroup的效果)

? ? 最后說(shuō)下ActionBar+FragmentActivity+Fragment來(lái)替換掉TabHost。在使用過(guò)程中發(fā)現(xiàn)這個(gè)ActionBar限制有點(diǎn)多,于是舍棄了,貼下實(shí)現(xiàn)代碼。

public class FragmentActivity1 extends FragmentActivity implements ActionBar.TabListener{public static FragmentManager fm;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_acitivity_1);fm = getSupportFragmentManager();ActionBar actionBar=this.getActionBar();this.getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); this.getActionBar().setDisplayShowTitleEnabled(false); this.getActionBar().setDisplayShowHomeEnabled(false); setBar("Tab 1");setBar("Tab 2"); setBar("Tab 3"); setBar("Tab 4"); // 只當(dāng)容器,主要內(nèi)容已Fragment呈現(xiàn)initFragment(new Fragment1());}/*** */private void setBar(String s) {Tab tab = this.getActionBar().newTab(); tab.setContentDescription(s); tab.setText(s); tab.setTabListener(this);getActionBar().addTab(tab);}// 切換Fragmentpublic static void changeFragment(Fragment f){changeFragment(f, false);}// 初始化Fragment(FragmentActivity中呼叫)public static void initFragment(Fragment f){changeFragment(f, true);}private static void changeFragment(Fragment f, boolean init){FragmentTransaction ft = fm.beginTransaction();ft.replace(R.id.simple_fragment, f);if(!init)ft.addToBackStack(null);ft.commit();}@Overridepublic void onTabReselected(Tab arg0, android.app.FragmentTransaction arg1) {// TODO Auto-generated method stub }@Overridepublic void onTabSelected(Tab arg0, android.app.FragmentTransaction arg1) {// TODO Auto-generated method stubif(arg0.getText().equals("Tab 1")){changeFragment(new Fragment1());}else {changeFragment(new Fragment2());}}@Overridepublic void onTabUnselected(Tab arg0, android.app.FragmentTransaction arg1) {// TODO Auto-generated method stub } }

在minSdkVersion設(shè)置為11后就能調(diào)用getActionBar()方法了,可以給它添加tab,然后重點(diǎn)是為ActionBar.TabListener寫(xiě)點(diǎn)擊Tab時(shí)要實(shí)現(xiàn)的功能,這里我進(jìn)行了Fragment的切換,以達(dá)到TabHost相同的效果。要注意的是如果該FragmentActivity是嵌套在其他Activity中(比方說(shuō)TabHost)時(shí),getAction將會(huì)返回null,即無(wú)法進(jìn)行分頁(yè),其他情況下也有可能返回null,限制還是比較多的。

轉(zhuǎn)載于:https://www.cnblogs.com/linjzong/p/3299155.html

總結(jié)

以上是生活随笔為你收集整理的Android 动态Tab分页效果实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。