小妹请教前辈帮我看看TabHost问题。

wangtiantian23 2011-02-15 10:13:14
我从网上找了一个仿iphone布局的一个代码,自己把它拆开,拆成几个类处理。
处理到TabHost的时候出了问题。

请帮我看看我一个LinearLayout加了一个TabHost,但是就是不显示,
我引用了一个类,刚刚学些Android不知道哪里出错了!

请帮我指正一下。

MainActivity.java 主 Activity

package 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>





...全文
578 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
up_mango 2011-07-21
  • 打赏
  • 举报
回复
怎么解决的大哥 我也遇到了 我日
wangtiantian23 2011-02-18
  • 打赏
  • 举报
回复
没有报错!我没说有错啊!

我的意思是看看能不能用main.xml里class引用的方式实现。

请您看看我的解释!!我还是没搞通那!唉~~~~

SongQues 2011-02-18
  • 打赏
  • 举报
回复
你这东西报什么错呀!看头我就迷糊!
wangtiantian23 2011-02-18
  • 打赏
  • 举报
回复
问题我自己解决了!哈哈~~哈哈~~

自学成才!!!
wangtiantian23 2011-02-17
  • 打赏
  • 举报
回复
有人下载帮我看看吗!
appleflashstudio 2011-02-16
  • 打赏
  • 举报
回复
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();
}

});
wangtiantian23 2011-02-16
  • 打赏
  • 举报
回复
可以直接运行的!你拷贝过去!就可以运行的!最好是运行帮忙看看!

没办法!不知道怎么能把整个工程发到帖子里!
long563679994 2011-02-16
  • 打赏
  • 举报
回复
这么长,看得晕,
wangtiantian23 2011-02-16
  • 打赏
  • 举报
回复
dialog 的问题可以往后放放!可以不用解决!我换个方式都行!反正是练习!

在main.xml里的这句话看看帮忙解决一下!如何引用一个类 来实现。
<TabHost
class="com.myAndroid.exercise.iTabHost" //这里是引用那个类。
wangtiantian23 2011-02-16
  • 打赏
  • 举报
回复
我看了!这是在一个Activity里实现的!

我现在想把它分成一个类!另外一个控件或者布局来调用!

其实我都写的差不多了!就是不知道怎么调用!
sky123123 2011-02-16
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_643e83860100q4hl.html
sky123123 2011-02-16
  • 打赏
  • 举报
回复
给你个链接吧 希望能够帮助你、
wangtiantian23 2011-02-16
  • 打赏
  • 举报
回复
我把程序放到网上!大家下载一下,帮我看看怎么修改!谢谢各位了!


http://www.rayfile.com/zh-cn/files/86c732c2-3992-11e0-8731-0015c55db73d/
wangtiantian23 2011-02-15
  • 打赏
  • 举报
回复
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.java

package 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.java

package 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 );
}
}

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧