zoukankan      html  css  js  c++  java
  • Android之TabHost实现Tab切换

    TabHost是整个Tab的容器,包含TabWidget和FrameLayout两个部分,TabWidget是每个Tab的表情,FrameLayout是Tab内容。

    实现方式有两种:

    1、继承TabActivity

    2、继承Activity类

    方法一:继承TabActivity

    从TabActivity中用getTabHost()方法获取TabHost,然后设置标签内容

    布局:

      1、TabHost    必须设置android:id为@android:id/tabhost
      2、TabWidget   必须设置android:id为@android:id/tabs
      3、FrameLayout   必须设置android:id为@android:id/tabcontent

    否则将出现类似报错:

    <?xml version="1.0" encoding="utf-8"?>
    <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@android:id/tabhost"
         >
        
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        
        <TabWidget 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@android:id/tabs"
            ></TabWidget>
        
        <FrameLayout 
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:id="@android:id/tabcontent"
            >
            <LinearLayout 
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/widget_layout_red"
                android:background="#ff0000"
                android:orientation="vertical"
                ></LinearLayout>
            
             <LinearLayout 
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/widget_layout_yellow"
                android:background="#FCD209"
                android:orientation="vertical"
                ></LinearLayout>
            
        </FrameLayout>
    </LinearLayout>
    </TabHost>

    继承TabActivity

    public class MainActivity extends TabActivity {
    private TabHost tabhost;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.demo);
            
            //从TabActivity上面获取放置Tab的TabHost
            tabhost = getTabHost();
    
            tabhost.addTab(tabhost
                     //创建新标签one
                    .newTabSpec("one")
                    //设置标签标题
                    .setIndicator("红色")
                    //设置该标签的布局内容
                    .setContent(R.id.widget_layout_red));
            tabhost.addTab(tabhost.newTabSpec("two").setIndicator("黄色").setContent(R.id.widget_layout_yellow));
        }
    
    
    }

    其中创建标签的方法:

    tabhost.addTab(tabhost
    .newTabSpec("one")
    .setIndicator("红色")
    .setContent(R.id.widget_layout_red));

    也可以拆分写成:

    TabHost.TabSpec tab1 = tabhost.newTabSpec("one");
    tab1.setIndicator("红色");
    tab1.setContent(R.id.widget_layout_red);       
    tabhost.addTab(tab1);

    预览:

    点击"黄色"标签

    点击"红色"标签 

    方法二:继承Activity类

    布局:

    1、TabHost    可自定义id
    2、TabWidget   必须设置android:id为@android:id/tabs
    3、FrameLayout   必须设置android:id为@android:id/tabcontent

    public class MainActivity extends Activity{
    private TabHost tabhost;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.demo);
            
            //得到TabHost对象实例
            tabhost =(TabHost) findViewById(R.id.mytab);
            //调用 TabHost.setup()
            tabhost.setup();
            //创建Tab标签
            tabhost.addTab(tabhost.newTabSpec("one").setIndicator("红色").setContent(R.id.widget_layout_red));
            tabhost.addTab(tabhost.newTabSpec("two").setIndicator("黄色").setContent(R.id.widget_layout_yellow));
        }
    }

     

    TabHost切换Tab字体的颜色背景颜色改变

    private TabHost tabHost;
    private TabWidget tabWidget;

    //
    得到TabHost对象实例 tabHost =(TabHost) findViewById(R.id.taskdescribe_buildingmeter_tabhost); //调用 TabHost.setup() tabHost.setup(); tabWidget = tabHost.getTabWidget(); //创建Tab标签 tabHost.addTab(tabHost.newTabSpec("one").setIndicator("按单元名").setContent(R.id.buildingmeter_layout_unitname)); tabHost.addTab(tabHost.newTabSpec("two").setIndicator("按安装状态").setContent(R.id.buildingmeter_layout_installstatus)); tabHost.addTab(tabHost.newTabSpec("three").setIndicator("按楼层").setContent(R.id.buildingmeter_layout_storey)); //注意这个就是改变Tabhost默认样式的地方,一定将这部分代码放在上面这段代码的下面,不然样式改变不了 for (int i =0; i < tabWidget.getChildCount(); i++) { tabWidget.getChildAt(i).getLayoutParams().height = 65; //tabWidget.getChildAt(i).getLayoutParams().width = 65; TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title); tv.setTextSize(15); tv.setTextColor(this.getResources().getColorStateList(android.R.color.white)); } //设置第一次打开时默认显示的标签 tabHost.setCurrentTab(0); //初始化Tab的颜色,和字体的颜色 updateTab(tabHost); //选择监听器 tabHost.setOnTabChangedListener(new tabChangedListener());
    /**
         * 更新Tab标签的颜色,和字体的颜色
         * @param tabHost
         */
        private void updateTab(final TabHost tabHost) 
        {
            for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) 
            {
                View view = tabHost.getTabWidget().getChildAt(i);
                TextView tv = (TextView) tabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title);
                tv.setTextSize(16);
                tv.setTypeface(Typeface.SERIF, 2); // 设置字体和风格
                if (tabHost.getCurrentTab() == i) 
                {
                    //选中
                    view.setBackground(getResources().getDrawable(R.drawable.tabhost_current));//选中后的背景
                    tv.setTextColor(this.getResources().getColorStateList(android.R.color.white));
                } 
                else 
                {
                    //不选中
                    view.setBackground(getResources().getDrawable(R.drawable.tabhost_default));//非选择的背景
                    tv.setTextColor(this.getResources().getColorStateList(android.R.color.black));
                }
            }
        }
        
        /**
         * TabHost选择监听器
         * @author 
         *
         */
        private class tabChangedListener implements OnTabChangeListener {
    
              @Override
              public void onTabChanged(String tabId) 
              {
                  tabHost.setCurrentTabByTag(tabId);
                  updateTab(tabHost);
              }
        }

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/taskdescribe_buildingmeter_tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white" >
    
        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            
            <TabWidget 
                android:id="@android:id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">  
            </TabWidget>
            <FrameLayout 
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <LinearLayout
                    android:id="@+id/buildingmeter_layout_unitname" 
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    android:background="@color/white">
                </LinearLayout>
                <LinearLayout 
                    android:id="@+id/buildingmeter_layout_installstatus" 
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    android:background="@color/white">
                </LinearLayout>
                <LinearLayout 
                    android:id="@+id/buildingmeter_layout_storey" 
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    android:background="@color/white">
                </LinearLayout>
                
            </FrameLayout>
        </LinearLayout>
    </TabHost>

    TabHost切换Tab页面使用Intent

    切换效果

    先是layout文件夹中的布局文件,代码如下:

    <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            android:background="@drawable/category_bg"
            android:padding="0dp" >
    
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="wrap_content"
                android:layout_height="40dp"/>
    
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@drawable/context_bg"
                android:padding="0dp" />
        </LinearLayout>
    
    </TabHost>

    java文件

    import android.app.TabActivity; 
    import android.content.Intent; 
    import android.graphics.Typeface; 
    import android.os.Bundle; 
    import android.view.KeyEvent; 
    import android.view.View; 
    import android.view.Window; 
    import android.view.WindowManager; 
    import android.widget.TabHost; 
    import android.widget.TabHost.OnTabChangeListener; 
    import android.widget.TextView; 
    import com.dzdc.R; 
     
    @SuppressWarnings("deprecation") 
    public class IndexActivity extends TabActivity { 
        private String[] tabMenu = { "热菜", "冷菜", "海鲜", "川菜", "酒饮", "招牌菜" }; 
        private Intent intent0, intent1, intent2, intent3, intent4, intent5; 
        private Intent[] intents = { intent0, intent1, intent2, intent3, intent4, 
                intent5 }; 
        private TabHost.TabSpec tabSpec0, tabSpec1, tabSpec2, tabSpec3, tabSpec4, 
                tabSpec5; 
        private TabHost.TabSpec[] tabSpecs = { tabSpec0, tabSpec1, tabSpec2, 
                tabSpec3, tabSpec4, tabSpec5 }; 
     
        private TabHost tabHost = null; 
     
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏  
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                    WindowManager.LayoutParams.FLAG_FULLSCREEN); 
            setContentView(R.layout.index); 
     
            tabHost = getTabHost(); 
     
            for (int i = 0; i < tabMenu.length; i++) { 
                intents[i] = new Intent(); 
                intents[i].setClass(this, IndexContentActivity.class); 
     
                tabSpecs[i] = tabHost.newTabSpec(tabMenu[i]); 
                tabSpecs[i].setIndicator(tabMenu[i]);// 设置文字  
                tabSpecs[i].setContent(intents[i]);// 设置该页的内容  
     
                tabHost.addTab(tabSpecs[i]);// 将该页的内容添加到Tabhost  
            } 
     
            tabHost.setCurrentTabByTag(tabMenu[0]); // 设置第一次打开时默认显示的标签,  
             
            updateTab(tabHost);//初始化Tab的颜色,和字体的颜色  
             
            tabHost.setOnTabChangedListener(new OnTabChangedListener()); // 选择监听器  
     
     
        } 
     
        class OnTabChangedListener implements OnTabChangeListener { 
     
            @Override 
            public void onTabChanged(String tabId) { 
                tabHost.setCurrentTabByTag(tabId); 
                updateTab(tabHost); 
            } 
        } 
     
     
        @Override 
        public boolean onKeyDown(int keyCode, KeyEvent event) { 
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
                System.exit(0); 
                return false; 
            } else if (keyCode == KeyEvent.KEYCODE_MENU 
                    && event.getRepeatCount() == 0) { 
                return true; // 返回true就不会弹出默认的setting菜单  
            } 
     
            return false; 
        } 
         
        /**
         * 更新Tab标签的颜色,和字体的颜色
         * @param tabHost
         */ 
        private void updateTab(final TabHost tabHost) { 
            for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) { 
                View view = tabHost.getTabWidget().getChildAt(i); 
                TextView tv = (TextView) tabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); 
                tv.setTextSize(16); 
                tv.setTypeface(Typeface.SERIF, 2); // 设置字体和风格  
                if (tabHost.getCurrentTab() == i) {//选中  
                    view.setBackgroundDrawable(getResources().getDrawable(R.drawable.category_current));//选中后的背景  
                    tv.setTextColor(this.getResources().getColorStateList( 
                            android.R.color.black)); 
                } else {//不选中  
                    view.setBackgroundDrawable(getResources().getDrawable(R.drawable.category_bg));//非选择的背景  
                    tv.setTextColor(this.getResources().getColorStateList( 
                            android.R.color.white)); 
                } 
            } 
        } 
    } 
  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/guop/p/5018486.html
Copyright © 2011-2022 走看看