我从网上找了一个仿iphone布局的一个代码,自己把它拆开,拆成几个类处理。
处理到TabHost的时候出了问题。请帮我看看我一个LinearLayout加了一个TabHost,但是就是不显示,
我引用了一个类,刚刚学些Android不知道哪里出错了!请帮我指正一下。MainActivity.java    主 Activitypackage com.myAndroid.exercise;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import com.myAndroid.exercise.iTab.OnTabClickListener;
import com.myAndroid.exercise.iTab.TabMember;public class MainActivity extends Activity 
{
public static final String TAG = "SAMPLEAPP";  private static final int TAB_HIGHLIGHT = 1;
private static final int TAB_CHAT = 2;
private static final int TAB_LOOPBACK = 3;
private static final int TAB_REDO = 4;
private iTab mTabs;
private LinearLayout  mTabLayout_One;
private LinearLayout  mTabLayout_Two;
private LinearLayout  mTabLayout_Three;
private LinearLayout  mTabLayout_Four;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 
        
        mTabs = (iTab) this.findViewById( R.id.Tabs );
        mTabLayout_One = (LinearLayout) this.findViewById( R.id.TabLayout_One );
        mTabLayout_Two = (LinearLayout) this.findViewById( R.id.TabLayout_Two );
        mTabLayout_Three = (LinearLayout) this.findViewById( R.id.TabLayout_Three );
        mTabLayout_Four = (LinearLayout) this.findViewById( R.id.TabLayout_Four );
        
        mTabs.addTabMember( new TabMember( TAB_HIGHLIGHT, "Loopback", R.drawable.loopback ) );
        mTabs.addTabMember( new TabMember( TAB_CHAT, "Chat", R.drawable.chat ) );
        mTabs.addTabMember( new TabMember( TAB_LOOPBACK, "download", R.drawable.download ) );
        mTabs.addTabMember( new TabMember( TAB_REDO, "redo", R.drawable.redo ) );
        
        //初始化状态下显示某一布局
mTabLayout_One.setVisibility( View.VISIBLE );
mTabLayout_Two.setVisibility( View.GONE );
mTabLayout_Three.setVisibility( View.GONE );
mTabLayout_Four.setVisibility( View.GONE );
//点击底部某一选项卡时出现界面
        mTabs.setOnTabClickListener( new OnTabClickListener( ) {
         @Override
         public void onTabClick( int tabId )
         {
         if( tabId == TAB_HIGHLIGHT )
         {
         mTabLayout_One.setVisibility( View.VISIBLE );
         mTabLayout_Two.setVisibility( View.GONE );
         mTabLayout_Three.setVisibility( View.GONE );
         mTabLayout_Four.setVisibility( View.GONE );
         } else if( tabId == TAB_CHAT )
         {
         mTabLayout_One.setVisibility( View.GONE );
         mTabLayout_Two.setVisibility( View.VISIBLE );
         mTabLayout_Three.setVisibility( View.GONE );
         mTabLayout_Four.setVisibility( View.GONE );
         } else if( tabId == TAB_LOOPBACK )
         {
         mTabLayout_One.setVisibility( View.GONE );
         mTabLayout_Two.setVisibility( View.GONE );
         mTabLayout_Three.setVisibility( View.VISIBLE );
         mTabLayout_Four.setVisibility( View.GONE );
         } else if( tabId == TAB_REDO )
         {
         mTabLayout_One.setVisibility( View.GONE );
         mTabLayout_Two.setVisibility( View.GONE );
         mTabLayout_Three.setVisibility( View.GONE );
         mTabLayout_Four.setVisibility( View.VISIBLE );
         }
         }
        });
    }
}
main.xml  这里就是布局文件第一个LinearLayout有一个tabHost <?xml version="1.0" encoding="utf-8"?><view xmlns:android="http://schemas.android.com/apk/res/android"
class="com.myAndroid.exercise.iRelativeLayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background = "#C5CCD4FF"
>
<LinearLayout
android:id = "@+id/TabLayout_One"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_above = "@+id/Tabs"
>
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content">
<RelativeLayout
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:visibility = "visible"
>
<TabHost 
    class="com.myAndroid.exercise.iTabHost" //这里是引用那个类。
    android:id="@android:id/tabhost" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
>
<LinearLayout 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"></TabWidget>
<FrameLayout android:id="@android:id/tabcontent" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent">
<TextView android:id="@+id/textview1" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:text="this is a tab"/>
<TextView android:id="@+id/textview2" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:text="this is another tab"/>
<TextView android:id="@+id/textview3" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:text="this is a third tab"/>
</FrameLayout>
</LinearLayout>
</TabHost>
</RelativeLayout>
</ScrollView>
</LinearLayout>
<LinearLayout
android:id = "@+id/TabLayout_Two"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_above = "@+id/Tabs"
>
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content">
<RelativeLayout
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:visibility = "visible"
android:layout_above = "@+id/Tabs"
>
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "HEHE YO"
/>
</RelativeLayout>
</ScrollView>
</LinearLayout>
<LinearLayout
android:id = "@+id/TabLayout_Three"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_above = "@+id/Tabs"
>
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content">
<RelativeLayout
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:visibility = "visible"
android:layout_above = "@+id/Tabs"
>
<TextView
android:textColor="@android:color/black"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Text View o.o!!!"
/>
</RelativeLayout>
</ScrollView>
</LinearLayout>
<LinearLayout
android:id = "@+id/TabLayout_Four"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_above = "@+id/Tabs"
>
<ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content">
<RelativeLayout
android:id = "@+id/TabLayout_Four"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:visibility = "visible"
android:layout_above = "@+id/Tabs"
>
<TextView
android:textColor="@android:color/black"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Well .. It's obvious - isn't it?"
/>
</RelativeLayout>
</ScrollView>
</LinearLayout>

<view
class="com.myAndroid.exercise.iTab"
android:id="@+id/Tabs"
android:layout_width = "fill_parent"
android:layout_height = "49px"
android:layout_alignParentBottom = "true"
/>
</view>

解决方案 »

  1.   

    iTabHost.java 主要是这里报错package com.myAndroid.exercise;import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.TabActivity;
    import android.content.DialogInterface;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.widget.TabHost;
    import android.widget.TabHost.OnTabChangeListener;public class iTabHost extends TabActivity
    {
    //声明TabHost对象
    TabHost mTabHost;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //取得TabHost对象
    mTabHost = getTabHost();
        
    /* 为TabHost添加标签 */
    //新建一个newTabSpec(newTabSpec)
    //设置其标签和图标(setIndicator)
    //设置内容(setContent)
        mTabHost.addTab(mTabHost.newTabSpec("tab_test1")
         .setIndicator("TAB 1",getResources().getDrawable(R.drawable.img1))
         .setContent(R.id.textview1));
        mTabHost.addTab(mTabHost.newTabSpec("tab_test2")
         .setIndicator("TAB 2",getResources().getDrawable(R.drawable.img2))
         .setContent(R.id.textview2));
        mTabHost.addTab(mTabHost.newTabSpec("tab_test3")
         .setIndicator("TAB 3",getResources().getDrawable(R.drawable.img3))
         .setContent(R.id.textview3));
        
        //设置TabHost的背景颜色
        mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150));
        //设置TabHost的背景图片资源
        //mTabHost.setBackgroundResource(R.drawable.bg0);
        
        //设置当前显示哪一个标签
        mTabHost.setCurrentTab(0);
        
        //标签切换事件处理,setOnTabChangedListener 
        mTabHost.setOnTabChangedListener(new OnTabChangeListener()
        {
         // TODO Auto-generated method stub
                @Override
                public void onTabChanged(String tabId) 
                {
                
                 /* 这里报错 无法显示 Dialog  
                  * 主要是 Dialog dialog = new AlertDialog.Builder(MainActivity.this) 报错
                  * Dialog dialog = new AlertDialog.Builder(MainActivity.this)
          .setTitle("提示")
          .setMessage("当前选中:"+tabId+"标签")
          .setPositiveButton("确定",
          new DialogInterface.OnClickListener() 
          {
          public void onClick(DialogInterface dialog, int whichButton)
          {
          dialog.cancel();
          }
          }).create();//创建按钮
      
                 dialog.show();*/
                }            
            });
    }
    }
    iRelativeLayout.javapackage com.myAndroid.exercise;import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.util.AttributeSet;
    import android.widget.RelativeLayout;
    //注意,还是声明为静态
    public class iRelativeLayout extends RelativeLayout
    {
    private Paint mPaint;
    private Rect mRect;

    public iRelativeLayout( Context context, AttributeSet attrs ) 
    {
    super(context, attrs);

    mRect = new Rect( );
    mPaint = new Paint( );

    mPaint.setStyle( Paint.Style.FILL_AND_STROKE );
    mPaint.setColor( 0xFFCBD2D8 );
    }

    @Override
    protected void onDraw( Canvas canvas )
    {
    super.onDraw( canvas ); canvas.drawColor( 0xFFC5CCD4 );

    this.getDrawingRect( mRect );

    for( int i = 0; i < mRect.right; i += 7 ) //绘制屏幕背景的纹理效果
    {
    canvas.drawRect( mRect.left + i, mRect.top, mRect.left + i + 2, mRect.bottom, mPaint );
    }
    }
    }iTab.javapackage com.myAndroid.exercise;import java.util.ArrayList;import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.LinearGradient;
    import android.graphics.Paint;
    import android.graphics.Rect;
    import android.graphics.RectF;
    import android.graphics.Shader;
    import android.graphics.Paint.Align;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.widget.ImageView;//MainActivity这个类里面的两个static类,看我写的注释和上篇博客的内容应该都能理解。
    //其中还定义了触摸事件,实现点击tab出现不同布局的效果。接下来我们只需要在我们的layout上添加就可以了
    public class iTab extends ImageView 
    {
        private Paint mPaint; //背景画笔
        private Paint mActiveTextPaint;//选中
        private Paint mInactiveTextPaint;//未选中
        private ArrayList<TabMember> mTabMembers;//tab成员
        private int mActiveTab;
        private OnTabClickListener mOnTabClickListener = null;
        
    public iTab( Context context, AttributeSet attrs )  //构造器,View下构造器有三种方式,在xml中配置必须实现这种方式
    {
    super(context, attrs);

    mTabMembers = new ArrayList<iTab.TabMember>( );

    mPaint = new Paint( );
    mActiveTextPaint = new Paint( );//Paint类包含样式和颜色有关如何绘制几何形状,文本和位图的信息
    mInactiveTextPaint = new Paint( );

    mPaint.setStyle( Paint.Style.FILL ); //设置样式
    mPaint.setColor( 0xFFFFFF00 );//设置颜色
     
    mActiveTextPaint.setTextAlign( Align.CENTER );//设置文本对齐
    mActiveTextPaint.setTextSize( 12 );//设置大小
    mActiveTextPaint.setColor( 0xFFFFFFFF );//设置颜色
    mActiveTextPaint.setFakeBoldText( true );//仿“粗体”设置

    mInactiveTextPaint.setTextAlign( Align.CENTER );//设置文本对齐
    mInactiveTextPaint.setTextSize( 12 );//设置大小
    mInactiveTextPaint.setColor( 0xFF999999 );//设置颜色
    mInactiveTextPaint.setFakeBoldText( true );//仿“粗体”设置

    mActiveTab = 0;
    }

        @Override
        protected void onDraw( Canvas canvas )
        {
         Log.d( VIEW_LOG_TAG, "iTab onDraw start" );
         super.onDraw( canvas );
        
         Rect r = new Rect( );
         this.getDrawingRect( r );
        
         // 计算每个标签能使用多少像素
         int singleTabWidth = r.right / ( mTabMembers.size( ) != 0 ? mTabMembers.size( ) : 1 );
        
         Log.d( VIEW_LOG_TAG, "iTab: SingleTabWidth: " + singleTabWidth );
        
         // 绘制背景
         canvas.drawColor( 0xFF000000 );
         mPaint.setColor( 0xFF434343 );
         canvas.drawLine( r.left, r.top + 1, r.right, r.top + 1, mPaint );
        
         int color = 46;
        
         for( int i = 0; i < 24; i++ )
         {
         mPaint.setARGB( 255, color, color, color );
         canvas.drawRect( r.left, r.top + i + 1, r.right, r.top + i + 2, mPaint );
         color--;
         }     // 绘制每一个tab
         for( int i = 0; i < mTabMembers.size( ); i++ )
         {
         TabMember tabMember = mTabMembers.get( i );
        
         Bitmap icon = BitmapFactory.decodeResource( getResources( ), tabMember.getIconResourceId( ) );
    Bitmap iconColored = Bitmap.createBitmap( icon.getWidth(), icon.getHeight(), Bitmap.Config.ARGB_8888 );
    Paint p = new Paint( Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
    Canvas iconCanvas = new Canvas( );
    iconCanvas.setBitmap( iconColored ); if( mActiveTab == i )//为已选中的tab绘制一个白蓝的渐变色,未选中的绘制一个白灰的渐变色
    {
    p.setShader( new LinearGradient( 0, 0, icon.getWidth(), icon.getHeight(), 0xFFFFFFFF, 0xFF54C7E1, Shader.TileMode.CLAMP ) );
    }
    else {    
    p.setShader( new LinearGradient( 0, 0, icon.getWidth(), icon.getHeight(), 0xFFA2A2A2, 0xFF5F5F5F, Shader.TileMode.CLAMP ) );
    }

    iconCanvas.drawRect( 0, 0, icon.getWidth( ), icon.getHeight( ), p );

    for( int x = 0; x < icon.getWidth(); x++ )
    {
    for( int y = 0; y < icon.getHeight(); y++ )
    {
    if( ( icon.getPixel(x, y) & 0xFF000000 ) == 0 )
    {
    iconColored.setPixel( x, y, 0x00000000 );
    }
    }
    }

    // 计算tab图片的位置
         int tabImgX = singleTabWidth * i + ( singleTabWidth / 2 - icon.getWidth( ) / 2 );
        
         // 绘制tab图片 选中的和未选中的
         if( mActiveTab == i )
         {
         mPaint.setARGB( 37, 255, 255, 255 );
         canvas.drawRoundRect(  new RectF( r.left + singleTabWidth * i + 3, r.top + 3, r.left + singleTabWidth * ( i + 1 ) - 3, r.bottom - 2 ), 5, 5, mPaint );
         canvas.drawBitmap( iconColored, tabImgX , r.top + 5, null );
         canvas.drawText( tabMember.getText( ), singleTabWidth * i + ( singleTabWidth / 2), r.bottom - 2, mActiveTextPaint );
         } else
         {
         canvas.drawBitmap( iconColored, tabImgX , r.top + 5, null );
         canvas.drawText( tabMember.getText( ), singleTabWidth * i + ( singleTabWidth / 2), r.bottom - 2, mInactiveTextPaint );
         }
         }     Log.d( VIEW_LOG_TAG, "iTab onDraw finished" );
        }
        
        /*          * 触摸事件          */
        @Override
        public boolean onTouchEvent( MotionEvent motionEvent )
        {
         Rect r = new Rect( );
         this.getDrawingRect( r );        
         float singleTabWidth = r.right / ( mTabMembers.size( ) != 0 ? mTabMembers.size( ) : 1 );
        
         int pressedTab = (int) ( ( motionEvent.getX( ) / singleTabWidth ) - ( motionEvent.getX( ) / singleTabWidth ) % 1 );
        
         mActiveTab = pressedTab;
        
         if( this.mOnTabClickListener != null)
         {
         this.mOnTabClickListener.onTabClick( mTabMembers.get( pressedTab ).getId( ) );        
         }
        
         this.invalidate();
        
         return super.onTouchEvent( motionEvent );
        }
        
        void addTabMember( TabMember tabMember )
        {
         mTabMembers.add( tabMember );
        }
        
        void setOnTabClickListener( OnTabClickListener onTabClickListener )
        {
         mOnTabClickListener = onTabClickListener;
        }
        
       //处理tab成员
        public static class TabMember
        {
         protected int mId;
         protected String mText;
         protected int  mIconResourceId;
        
         TabMember( int Id, String Text, int iconResourceId )
         {
         mId = Id;
         mIconResourceId = iconResourceId;
         mText = Text;
         }
        
         public int getId( )
         {
         return mId;
         }
        
         public String getText( )
         {
         return mText;
         }
        
         public int getIconResourceId( )
         {
         return mIconResourceId;
         }
             
         public void setText( String Text )
         {
         mText = Text;
         }
        
         public void setIconResourceId( int iconResourceId )
         {
         mIconResourceId = iconResourceId;
         }
        }
        
        public static interface OnTabClickListener
        {
         public abstract void onTabClick( int tabId );
        }
    }
      

  2.   

    mTabHost.setOnTabChangedListener(new OnTabChangeListener()
            {
                // TODO Auto-generated method stub
                @Override
                public void onTabChanged(String tabId) 
                {
                    
                }            
            });这段在页面切换的时候没有被调用呀,没找到解决方法。
    你要只是想在切换页面的时候弹出一个Dialog的话。那么放到MainActivity里可以,下面这样 //点击底部某一选项卡时出现界面
            mTabs.setOnTabClickListener( new OnTabClickListener( ) {
                @Override
                public void onTabClick( int tabId )
                {
                    if( tabId == TAB_HIGHLIGHT )
                    {
                        mTabLayout_One.setVisibility( View.VISIBLE );
                        mTabLayout_Two.setVisibility( View.GONE );
                        mTabLayout_Three.setVisibility( View.GONE );
                        mTabLayout_Four.setVisibility( View.GONE );
                    } else if( tabId == TAB_CHAT )
                    {
                        mTabLayout_One.setVisibility( View.GONE );
                        mTabLayout_Two.setVisibility( View.VISIBLE );
                        mTabLayout_Three.setVisibility( View.GONE );
                        mTabLayout_Four.setVisibility( View.GONE );
                    } else if( tabId == TAB_LOOPBACK )
                    {
                        mTabLayout_One.setVisibility( View.GONE );
                        mTabLayout_Two.setVisibility( View.GONE );
                        mTabLayout_Three.setVisibility( View.VISIBLE );
                        mTabLayout_Four.setVisibility( View.GONE );
                    } else if( tabId == TAB_REDO )
                    {
                        mTabLayout_One.setVisibility( View.GONE );
                        mTabLayout_Two.setVisibility( View.GONE );
                        mTabLayout_Three.setVisibility( View.GONE );
                        mTabLayout_Four.setVisibility( View.VISIBLE );
                    }
                    
                    
                    Dialog dialog = new AlertDialog.Builder(MainActivity.this)
                    .setTitle("提示")
                    .setMessage("当前选中:"+tabId+"标签")
                    .setPositiveButton("确定",
                    new DialogInterface.OnClickListener() 
                    {
                        public void onClick(DialogInterface dialog, int whichButton)
                        {
                            dialog.cancel();
                        }
                    }).create();//创建按钮            dialog.show();
                }
              
            });
      

  3.   

    dialog 的问题可以往后放放!可以不用解决!我换个方式都行!反正是练习!在main.xml里的这句话看看帮忙解决一下!如何引用一个类 来实现。
    <TabHost 
     class="com.myAndroid.exercise.iTabHost" //这里是引用那个类。
      

  4.   

    我把程序放到网上!大家下载一下,帮我看看怎么修改!谢谢各位了!
    http://www.rayfile.com/zh-cn/files/86c732c2-3992-11e0-8731-0015c55db73d/
      

  5.   

    http://blog.sina.com.cn/s/blog_643e83860100q4hl.html
      

  6.   

    我看了!这是在一个Activity里实现的!我现在想把它分成一个类!另外一个控件或者布局来调用!其实我都写的差不多了!就是不知道怎么调用!
      

  7.   

    没有报错!我没说有错啊!我的意思是看看能不能用main.xml里class引用的方式实现。请您看看我的解释!!我还是没搞通那!唉~~~~