TabActivity中子Activity相互跳轉(zhuǎn),,及某個(gè)Tab需彈出窗的解決方案在iphone開發(fā)中貌似有個(gè)UITabBarController,,(我以為是toolbar,,四樓的兄弟更正的),,UITabBarController在底部,,也有對(duì)應(yīng)的切換效果,,都封裝好了,。但是在android的中,這個(gè)東西它在頂部,。,。。我也不明白為什么這么設(shè)計(jì),,標(biāo)新立異,?我覺(jué)得在底部方便很多,我們的設(shè)計(jì)也是這樣設(shè)計(jì)的,,所以我也只有改咯,。 個(gè)人認(rèn)為設(shè)計(jì)不太好的tabhost,單手拿手機(jī)不好操作,,不過(guò)下面有個(gè)兄弟提醒因?yàn)橛衜enu的存在,,呵呵,我光想不方便了,。 整體的思想就是不進(jìn)行startactivity,,而是通過(guò)廣播發(fā)送數(shù)據(jù),發(fā)送之前切換到對(duì)應(yīng)的tab,。從而避免很多startactivity出現(xiàn)的麻煩,,比如tabwidget不見(jiàn)了,跳轉(zhuǎn)黑屏等等,。,。。彈出窗可以獲取到tabwidget對(duì)應(yīng)的標(biāo)簽位置,,設(shè)置其監(jiān)聽(tīng)事件,,阻塞掉原本tabwidget的切換就可以了。 先把這些tab挪到底部去,。布局代碼如下:
<TabHost xmlns:android="http://schemas./apk/res/android" android:id="@android:id/tabhost" 注意每個(gè)控件的相對(duì)位置,,位置對(duì)了,那個(gè)鬼東西才能跑底部去,,自定義的tabhost就是如此了,。。,。
然后上代碼,。。,。 public class TabManager extends TabActivity 網(wǎng)上很多人說(shuō)不要繼承tabactivity,,否則不能自定義tabhost,但在這就是這樣做了,,也沒(méi)錯(cuò),。還是自己實(shí)踐比較好,,別盲目轉(zhuǎn)帖。 有人提醒的,,多謝:樓主誤解了,,其實(shí)網(wǎng)上說(shuō)的是不能繼承tabactivity,否則不能自定義tabhost名,。 你這邊繼承了Tabactivity,, 同時(shí)布局文件中又用了android:id="@android:id/tabhost" ,,所以你沒(méi)錯(cuò),。你可以改下這個(gè)ID試試,一改就錯(cuò)了,。 如果想要自定義這個(gè)ID,,就不能繼承TabActivity。 我也沒(méi)試了,,大家有空去試試,。。,。 Constant.tabHost = (TabHost) findViewById(android.R.id.tabhost); LayoutInflater.from(this).inflate(R.layout.tabcontent, Constant.tabHost.getTabContentView(), true); tabWidget = Constant.tabHost.getTabWidget(); Constant.tabHost.addTab(Constant.tabHost.newTabSpec("tab1") .setIndicator("Tab1",th.getResources().getDrawable(R.drawable.ic_menu_home_tab)).setContent(new Intent(this, Tab1.class)));
View v = tabWidget.getChildAt(i); // 設(shè)置tab背景顏色 外層有個(gè)循環(huán),,每個(gè)tab都要設(shè)置一次 v.setBackgroundResource(R.drawable.tab_indicator); tab_indicator文件: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas./apk/res/android"> <!-- Non focused states --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@color/tab_unselected" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@color/tab_selected" /> <!-- Focused states --> <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@color/tab_focus" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@color/tab_focus" /> <!-- Pressed --> <item android:state_pressed="true" android:drawable="@color/tab_press"/> </selector> 下面是彈出窗口的 View view = tabWidget.getChildAt(4); view.setOnClickListener(new OnClickListener() { 獲取到你要彈出窗口的標(biāo)簽,設(shè)置setOnClickListener事件,,就可以阻塞掉tabhost原本的事件,。達(dá)到彈出窗口的效果。 Constant.tabHost = (TabHost) findViewById(android.R.id.tabhost); Constant.tabHost.setCurrentTab(0);跳轉(zhuǎn)就可以是這樣做了,。 Constant.tabHost 是全局變量,,這個(gè)是關(guān)鍵,為了切換tab不會(huì)出現(xiàn)黑屏跳轉(zhuǎn)效果,。
txTextView.setText("點(diǎn)擊切換到tab3"); txTextView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Constant.tabHost.setCurrentTab(2);//這里是全局變量的tabhost Intent intent = new Intent("com.niushu.recbroad"); intent.putExtra("id","從tab1過(guò)來(lái)的牛叔"); Tab1.this.sendBroadcast(intent); } });
這個(gè)是在tab1中點(diǎn)擊文字,,首先切換到對(duì)應(yīng)的tab,Constant.tabHost.setCurrentTab(2);,,啟動(dòng)對(duì)應(yīng)的activity,,然后發(fā)送廣播。用這個(gè)方Constant.tabHost.setCurrentTab切換,,就沒(méi)有那些亂七八糟的麻煩,。 如果發(fā)送廣播過(guò)去之后,接下來(lái)要用線程操作的話,,最好在建一個(gè)標(biāo)志位,,全局變量的。避免一些線程跟廣播資源之間的沖突,。 下面是接受廣播的代碼:需要注意在生命周期方法中注冊(cè)和注銷廣播接收器
public class Broad extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { disid_Broad = intent.getStringExtra("id"); Toast.makeText(Tab3.this, disid_Broad, 1).show(); Log.i("Broad", "onReceive"); } }
|
|
來(lái)自: herozhou1314 > 《android 技術(shù)文件》