zoukankan      html  css  js  c++  java
  • TabActivity中的Tab标签详细设置

    参考链接:

    http://www.iteye.com/topic/602737

    这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且每个具体的代码,还是搞了许久才出来,故而分享之,希望能给大家带来方便,也谢谢下面的高人,呵呵!

    http://www.youmi.net/bbs/thread-102-1-4.html

    这个和上面的代码是一样的,不过代码不全,对于初学者来说,考验的时候来了,完善就是提高的过程,不要怕麻烦!

    下面就根据上面的参考自己写的,当然大部分是相同的,不过有详细的注释,完整的代码

    如果有什么不明白就留言吧!呵呵

    首先结果图:

    图1:

    图2

    图3

    当然界面没有前面的仁兄好看,我是讲究实用,美化需要自己慢慢做了

    呵呵

    下面直接代码:

    package com.woclub.tabactivitytest;  
      
      
    import android.app.TabActivity;  
    import android.content.res.ColorStateList;  
    import android.graphics.Color;  
    import android.os.Bundle;  
    import android.util.Log;  
    import android.view.Gravity;  
    import android.view.View;  
    import android.widget.ImageView;  
    import android.widget.LinearLayout;  
    import android.widget.TabHost;  
    import android.widget.TabWidget;  
    import android.widget.TextView;  
    import android.widget.TabHost.OnTabChangeListener;  
      
    /** 
     * 总结:在设置Tab的布局的时候首先需要newTabSpec再在其设置setIndicator(Tab名字,Tab的图标), 
     * 尤其需要注意setContent(),它有三种使用方法setContent(int)它是直接在布局文件中设置其布局, 
     * setContent(Intent)可以用Intent指定一个Activity, 
     * setContent(TabContentFactory)可以用一个类来指定其布局的方式 
     * @author Administrator 
     * 
     */  
    public class MainActivity extends TabActivity {  
          
        private static final String Tab1 = "Tab1";  
        private static final String Tab2 = "Tab2";  
        private static final String Tab3 = "Tab3";  
        private static final String Tab4 = "Tab4";  
          
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
              
              
          //1得到TabHost对象,正对TabActivity的操作通常都有这个对象完成  
            final TabHost tabHost = this.getTabHost();  
            final TabWidget tabWidget = tabHost.getTabWidget();  
              
          //2生成一个Intent对象,该对象指向一个Activity,当然现在例子比较简单就没有绑定其他的Activity故而不用  
          //3生成一个TabSpec对象,这个对象代表了一个Tab页  
            TabHost.TabSpec tabSpec = tabHost.newTabSpec(Tab1);   
          //设置该页的indicator(指示器)设置该Tab页的名字和图标,以及布局  
            tabSpec.setIndicator(composeLayout("爽哉", R.drawable.coke))  
            .setContent(R.id.view1);  
          //4将设置好的TabSpec对象添加到TabHost当中  
            tabHost.addTab(tabSpec);  
              
            //第二个Tab  
            tabHost.addTab(tabHost.newTabSpec(Tab2).setIndicator(composeLayout("安逸", R.drawable.coke))  
                    .setContent(R.id.view2));  
              
          //第三个Tab  
            tabHost.addTab(tabHost.newTabSpec(Tab3).setIndicator(composeLayout("开心", R.drawable.coke))  
                    .setContent(R.id.view3));  
          //第四个Tab  
            tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator(composeLayout("说明", R.drawable.coke))  
                    .setContent(R.id.view4));  
              
     //setContent(TabContentFactory)可以用一个类来指定其布局的方式,前三个都是用的setContent(int)方式  
     //        CustomLayout custom = new CustomLayout(this);  
    //        tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator("Tab4", getResources()  
    //              .getDrawable(R.drawable.icon))  
    //              .setContent(custom));  
    //*****************************这是对Tab标签本身的设置*******************************************  
            int width =45;  
            int height =48;  
            for(int i = 0; i < tabWidget.getChildCount(); i++)  
            {  
                //设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果  
                tabWidget.getChildAt(i).getLayoutParams().height = height;  
                tabWidget.getChildAt(i).getLayoutParams().width = width;  
                 /**  
                  * 下面是设置Tab的背景,可以是颜色,背景图片等  
                  */  
                 View v = tabWidget.getChildAt(i);  
                if (tabHost.getCurrentTab() == i) {  
                    v.setBackgroundColor(Color.GREEN);  
                    //在这里最好自己设置一个图片作为背景更好  
                    //v.setBackgroundDrawable(getResources().getDrawable(R.drawable.chat));  
                } else {  
                    v.setBackgroundColor(Color.GRAY);  
                }  
            }  
              
    //************************************************************************************  
            //设置Tab变换时的监听事件  
            tabHost.setOnTabChangedListener(new OnTabChangeListener() {  
                  
                @Override  
                public void onTabChanged(String tabId) {  
                    // TODO Auto-generated method stub  
                    //当点击tab选项卡的时候,更改当前的背景  
                    for(int i = 0; i < tabWidget.getChildCount(); i++)  
                    {  
                    View v = tabWidget.getChildAt(i);  
                    if (tabHost.getCurrentTab() == i) {  
                        v.setBackgroundColor(Color.GREEN);  
                    } else {  
                        //这里最后需要和上面的设置保持一致,也可以用图片作为背景最好  
                        v.setBackgroundColor(Color.GRAY);  
                    }  
                    }  
                }  
            });  
              
        }  
    //#################################################################这是设置TabWidget的布局  
        /**  
         * 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合  
         * s:是文本显示的内容  
         * i:是ImageView的图片位置  
         * 将它设置到setIndicator(composeLayout("开心", R.drawable.coke))中  
         */  
        public View composeLayout(String s, int i){  
            Log.e("Error", "composeLayout");  
            LinearLayout layout = new LinearLayout(this);  
            layout.setOrientation(LinearLayout.VERTICAL);  
              
            TextView tv = new TextView(this);  
            tv.setGravity(Gravity.CENTER);  
            tv.setSingleLine(true);  
            tv.setText(s);  
            tv.setTextColor(Color.RED);  
            layout.addView(tv,   
                    new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
              
            ImageView iv = new ImageView(this);  
            iv.setImageResource(i);  
            layout.addView(iv,   
                    new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
            return layout;  
        }  
        //#################################################################  
          
    } 

    我都有详细的注释,估计大家都能看懂的,有些地方给了提示,扩展的需要就需要自己去完成了

    下面是一个两个布局文件

    一个是在layout中设置:

    <?xml version="1.0" encoding="utf-8"?>  
    <!--   
    一个典型的标签Activity  是由2 部分构成的 且其id都有规定 即:   
    * TabWidget 用于展示标签页 id=tabs   
    * FrameLayout 用于展示隶属于各个标签的具体布局 id=tabconten  
    * TabHost 用于整个Tab布局 id=TabHost  
    还需注意要将Tab显示在最下面就需要这只LinearLayout时用Bottom  
    -->  
    <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:orientation="vertical"  
            android:gravity="bottom"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent">   
            <FrameLayout  
                android:id="@android:id/tabcontent"    
                android:layout_width="fill_parent"       
                android:layout_height="200dip" >  
                <RelativeLayout  
                    android:id="@+id/view1"  
                    android:orientation="vertical"  
                    android:layout_width="fill_parent"  
                    android:layout_height="fill_parent">  
                    <TextView  
                    android:id="@+id/text1"  
                    android:layout_width="wrap_content"  
                    android:layout_height="wrap_content"  
                    android:text="需要光临第一个Tab"/>  
                    <ImageView  
                        android:id="@+id/image1"  
                        android:layout_height="wrap_content"  
                        android:layout_below="@id/text1"  
                        android:layout_width="wrap_content"  
                        android:src="@drawable/icon"  
                        />     
                </RelativeLayout>  
                  
                <TextView  
                    android:id="@+id/view2"  
                    android:layout_width="fill_parent"  
                    android:layout_height="fill_parent"  
                    android:text="需要光临第二个Tab"/>  
                <TextView  
                    android:id="@+id/view3"  
                    android:layout_width="fill_parent"  
                    android:layout_height="fill_parent"  
                    android:text="需要光临第三个Tab"/>  
                <TextView  
                    android:id="@+id/view4"  
                    android:layout_width="fill_parent"  
                    android:layout_height="fill_parent"  
                      
                    />  
            </FrameLayout>  
            <TabWidget  
                android:id="@android:id/tabs"  
                android:layout_width="fill_parent"  
                android:layout_height="wrap_content">  
            </TabWidget>  
        </LinearLayout>  
    </TabHost> 

     还有一个在类中设置,设置都差不多,在此类中设置只是针对每个Tab页面的设置

    package com.woclub.tabactivitytest;  
    import android.app.Activity;  
    import android.view.Gravity;  
    import android.view.LayoutInflater;  
    import android.view.View;  
    import android.widget.Button;  
    import android.widget.EditText;  
    import android.widget.ImageView;  
    import android.widget.LinearLayout;  
    import android.widget.RadioButton;  
    import android.widget.RadioGroup;  
    import android.widget.TabHost;  
    import android.widget.TextView;  
    /** 
     * 此类的功能是设置每个Tab标签的布局方式 
     * 使用方法 
     * CustomLayout ct = new CustomLayout(this);   
     * tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));  
     * @author Administrator 
     * 
     */  
    public class CustomLayout implements TabHost.TabContentFactory{  
      
        private Activity myActivity;  
        private LayoutInflater layoutHelper;//用于实例化布局  
        private LinearLayout layout;  
        //构造函数,从外面传递参数Activity  
        public CustomLayout(Activity myActivity)  
        {  
            this.myActivity = myActivity;  
            //通过getLayoutInflater从Activity中得到一个实例化的LayoutInflater  
            layoutHelper = myActivity.getLayoutInflater();  
        }  
        /** 
         * 根据不同的Tab创建不同的视图 
         */  
        @Override  
        public View createTabContent(String tag) {  
            // TODO Auto-generated method stub  
            return addCustomView(tag);  
        }  
          
        /** 
         * 根据Tab的id设置不同Tab的view 
         * 这是普通的设置方式,设置每个Tab的布局 
         * @param id 
         * @return 
         */  
        private View addCustomView(String id)  
        {  
            layout = new LinearLayout(myActivity);  
            layout.setOrientation(LinearLayout.HORIZONTAL);  
      
            if(id.equals("Tab1"))  
            {  
                ImageView iv = new ImageView(myActivity);  
                iv.setImageResource(R.drawable.chat);  
                //设置layout的布局,将一个ImageView添加到其中,并设置ImageView的布局格式,addView的第二个参数是设置ImageView的width和Height  
                layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));  
            }  
            else if(id.equals("Tab2"))  
            {  
                //第一个控件,注意每添加一个空间都需要用addView添加到layout中  
                EditText edit = new EditText(myActivity);  
                layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
                //第二个控件  
                Button button = new Button(myActivity);  
                button.setText("确定");  
                button.setWidth(100);  
                layout.addView(button, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));  
                //第三个控件  
                RadioGroup rGroup = new RadioGroup(myActivity);    
                rGroup.setOrientation(LinearLayout.HORIZONTAL);    
                RadioButton radio1 = new RadioButton(myActivity);    
                radio1.setText("Radio A");    
                rGroup.addView(radio1);    
                RadioButton radio2 = new RadioButton(myActivity);    
                radio2.setText("Radio B");    
                rGroup.addView(radio2);    
                    
                layout.addView(rGroup,    
                        new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));    
            }  
            else if(id.equals("Tab3"))  
            {  
                TextView text = new TextView(myActivity);  
                text.setText("the third TextView");  
                text.setGravity(Gravity.CENTER);  
                layout.addView(text);  
            }  
            else if(id.equals("Tab4"))  
            {  
                LinearLayout.LayoutParams param3 =    
                    new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);    
                 //在这里面又引用了布局文件来设置控件  
                layout.addView(layoutHelper.inflate(R.layout.hello, null),param3);  
            }  
            return layout;  
        }  
          
      
      
    }  

    文章来源:http://hao3100590.iteye.com/blog/974343

     

  • 相关阅读:
    c#对文件的读写
    win form treeview添加节点
    泛型的学习
    委托学习
    C#连接Oracle数据库解决报错(需要安装Oracle客户端软件8.1.7)的问题
    C#和Python 图片和base64的互转
    反射学习:(System.Reflection)
    objectivec:继承
    prism关键概念:
    三层架构的学习感悟(一)
  • 原文地址:https://www.cnblogs.com/gzggyy/p/2473883.html
Copyright © 2011-2022 走看看