这两天上论坛,发现有几个人问类似的问题,想想有空整理一个demo发上来。。。
      现在正处在前个项目正要走,后一个项目赶着来的那么一点点空隙中。。。
      这个是我项目中遇到的问题,也在论坛中发帖求助过,虽然没有得到完整的答案吧,不过还是有很多朋友提供思路了。在这里谢谢帮助过我的兄弟姐妹们了。

      言归正传!
      在iphone开发中貌似有个UITabBarController,(我以为是toolbar,四楼的兄弟更正的),UITabBarController在底部,也有对应的切换效果,都封装好了。但是在android的中,这个东西它在顶部。。。我也不明白为什么这么设计,标新立异?我觉得在底部方便很多,我们的设计也是这样设计的,所以我也只有改咯。
   个人认为设计不太好的tabhost,单手拿手机不好操作,不过下面有个兄弟提醒因为有menu的存在,呵呵,我光想不方便了。

整体的思想就是不进行startactivity,而是通过广播发送数据,发送之前切换到对应的tab。从而避免很多startactivity出现的麻烦,比如tabwidget不见了,跳转黑屏等等。。。
    弹出窗可以获取到tabwidget对应的标签位置,设置其监听事件,阻塞掉原本tabwidget的切换就可以了。
      先把这些tab挪到底部去。项目代码是在论坛里这个兄弟的基础上改的(传送门),不想从项目里整理了,麻烦。谢谢这个兄弟了。布局代码如下:
  1. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  2.    android:id="@android:id/tabhost" android:layout_width="fill_parent"
  3.      android:layout_height="fill_parent">
  4.    <LinearLayout android:orientation="vertical"
  5.     android:layout_width="fill_parent" android:layout_height="fill_parent">
  6.    <FrameLayout android:id="@android:id/tabcontent"
  7.       android:layout_width="fill_parent" android:layout_height="0dip"
  8.       android:layout_weight="1" />
  9.     <TabWidget android:id="@android:id/tabs"
  10.       android:layout_width="fill_parent" android:layout_height="wrap_content"
  11.         />
  12.     </LinearLayout>
  13. </TabHost>
复制代码
注意每个控件的相对位置,位置对了,那个鬼东西才能跑底部去,自定义的tabhost就是如此了。。。

然后上代码。。。
public class TabManager extends TabActivity

你这边继承了Tabactivity, 同时布局文件中又用了android:id="@android:id/tabhost" ,所以你没错。你可以改下这个ID试试,一改就错了。
如果想要自定义这个ID,就不能继承TabActivity。
我也没试了,大家有空去试试。。。
  1. Constant.tabHost = (TabHost) findViewById(android.R.id.tabhost);
  2. LayoutInflater.from(this).inflate(R.layout.tabcontent,
  3. Constant.tabHost.getTabContentView(), true);
  4. tabWidget = Constant.tabHost.getTabWidget();
  5. Constant.tabHost.addTab(Constant.tabHost.newTabSpec("tab1")
  6. .setIndicator("Tab1",th.getResources().getDrawable(R.drawable.ic_menu_home_tab)).setContent(new Intent(this, Tab1.class)));
复制代码
  1. View v = tabWidget.getChildAt(i);
  2. // 设置tab背景颜色 外层有个循环,每个tab都要设置一次
  3. v.setBackgroundResource(R.drawable.tab_indicator);


  4. tab_indicator文件:
  5. <?xml version="1.0" encoding="utf-8"?>
  6. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  7. <!-- Non focused states -->
  8. <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@color/tab_unselected" />
  9. <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@color/tab_selected" />

  10. <!-- Focused states -->
  11. <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@color/tab_focus" />
  12. <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@color/tab_focus" />

  13. <!-- Pressed -->
  14. <item android:state_pressed="true" android:drawable="@color/tab_press"/>
  15. </selector>
复制代码
下面是弹出窗口的
  1. View view = tabWidget.getChildAt(4);
  2. view.setOnClickListener(new OnClickListener() {
复制代码
获取到你要弹出窗口的标签,设置setOnClickListener事件,就可以阻塞掉tabhost原本的事件。
Constant.tabHost = (TabHost) findViewById(android.R.id.tabhost);
Constant.tabHost.setCurrentTab(0);跳转就可以是这样做了。
Constant.tabHost 是全局变量,这个是关键,为了切换tab不会出现黑屏跳转效果。
  1. txTextView.setText("点击切换到tab3");

  2. txTextView.setOnClickListener(new OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. Constant.tabHost.setCurrentTab(2);//这里是全局变量的tabhost

  6. Intent intent = new Intent("com.niushu.recbroad");
  7. intent.putExtra("id","从tab1过来的牛叔");
  8. Tab1.this.sendBroadcast(intent);
  9. }
  10. });
复制代码
这个是在tab1中点击文字,首先切换到对应的tab,Constant.tabHost.setCurrentTab(2);,启动对应的activity,然后发送广播。用这个方法Constant.tabHost.setCurrentTab切换,就没有那些乱七八糟的麻烦。
如果发送广播过去之后,接下来要用线程操作的话,最好在建一个标志位,全局变量的。避免一些线程跟广播资源之间的冲突。

下面是接受广播的代码:需要注意在生命周期方法中注册和注销广播接收器
  1. public class Broad extends BroadcastReceiver {

  2. @Override
  3. public void onReceive(Context context, Intent intent) {

  4. disid_Broad = intent.getStringExtra("id");
  5. Toast.makeText(Tab3.this, disid_Broad, 1).show();
  6. Log.i("Broad", "onReceive");

  7. }

  8. }
复制代码
高级工程师 2# computerfs 发表于 2011-8-4 09:03:49
不错
中级工程师 3# sialove 发表于 2011-8-4 09:34:34
顶顶顶
高级工程师 4# wuyangbo11 发表于 2011-8-14 20:50:39
中级工程师 5# timhu 发表于 2011-9-13 10:36:14
中级工程师 6# sunminghui 发表于 2011-9-15 09:01:15
顶起来
中级构架师 7# slider 发表于 2012-2-2 19:08:05
好久没有来,冒个泡
一切可以从头开始!!!
初级工程师 8# shiliu 发表于 2012-2-2 19:17:27
实习工程师 9# dsfs49 发表于 2012-2-6 08:28:46
学习了
中级工程师 10# chenwj312 发表于 2012-2-23 08:53:50
高级工程师 11# 半米阳光 发表于 2012-2-27 09:34:38
高级工程师 12# zzuwangfeng 发表于 2012-2-28 15:48:58
顶 起。。
高级工程师 13# zzuwangfeng 发表于 2012-2-28 15:49:11
赚个积分
高级工程师 14# zzuwangfeng 发表于 2012-2-28 15:49:21
实习工程师 15# zhang_xiwei 发表于 2012-2-28 16:05:33
牛 XX
实习工程师 16# 10jqka 发表于 2012-4-25 13:46:39
不错
高级工程师 17# muziri007 发表于 2012-4-27 17:14:28
顶!
不要问丧钟为谁而鸣,它为你而鸣!
您需要登录后才可以回帖 登录 | 注册

关于我们|手机版|Archiver|DEVDIV.COM ( 京ICP备07040843号 )  

GMT+8, 2012-5-19 16:37

Powered by DEVDIV.COM!

© 2010-2012 DEVDIV.COM Coummunity.

回顶部