亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

自定義RadioButton和ViewPager實現TabHost帶滑動的頁卡效果

2020-04-11 12:34:08
字體:
來源:轉載
供稿:網友

在工作中又很多需求都不是android系統自帶的控件可以達到效果的,內置的TabHost就是,只能達到簡單的效果 ,所以這個時候就要自定義控件來達到效果:這個效果就是: 使用自定義RadioButton和ViewPager實現TabHost帶滑動的頁卡效果。

這篇文章技術含量一般,大家別見笑。源碼我以測試,在底部可下載。
好了先上效果圖:

以下是實現步驟:        
1、準備自定義RadioButton控件的樣式圖片等,就是準備配置文件:

(1)、 在項目的values文件夾里面創建 attrs.xml :

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyRadioButton">
<attr name="pic" format="reference" />
</declare-styleable>
</resources>

(2)、創建 styles.xml:
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="radioButtonStyle">
<item name="android:button">@null</item>
<item name="android:textSize">12dip</item>
<item name="android:gravity">center_horizontal|bottom</item>
<item name="android:paddingBottom">5dip</item>
</style>

</resources>

(3)、把中文定義在string.xml里:
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="hello">Hello World, MainAct!</string>
<string name="app_name">TabHost</string>
<string name="home">大廳</string>
<string name="account">用戶</string>
<string name="beanExchange">玩具</string>
<string name="winAcciche">公告</string>
<string name="more">更多</string>

</resources>

(4)、創建MyRadioButton類繼承RadioButton:
復制代碼 代碼如下:

package com.dome.viewer.widget;

import com.dome.viewer.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.widget.RadioButton;


public class MyRadioButton extends RadioButton {

private Drawable drawable;

public MyRadioButton(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyRadioButton);
drawable = a.getDrawable(R.styleable.MyRadioButton_pic);
}
//Drawable轉換成Bitmap
private Bitmap drawable2Bitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof NinePatchDrawable) {
Bitmap bitmap = Bitmap
.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
} else {
return null;
}
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap image = drawable2Bitmap(drawable);
if (image != null) {
Paint pt = new Paint();
pt.setARGB(255, 66, 66, 66);
// 消除鋸齒
pt.setAntiAlias(true);
// 居中顯示圖片
int imageX = (int) (this.getWidth() - image.getWidth()) / 2;
canvas.drawBitmap(image, imageX, 2, pt);
pt.setARGB(255, 255, 255, 255);
}
}
}

(5)、為Activity準備布局文件,命名為:tabhost.xml:
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:attrstest="http://schemas.android.com/apk/res/com.dome.viewer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg" >

<RelativeLayout
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:background="@drawable/bg_navigation" >

<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerVertical="true"
android:layout_marginLeft="5dip"
android:gravity="center"
android:text="首頁"
android:textSize="25dip" />
</RelativeLayout>

<android.support.v4.view.ViewPager
android:id="@+id/vPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:paddingBottom="55dip"
android:persistentDrawingCache="animation" />

<RadioGroup
android:id="@+id/rg_main_btns"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:background="@drawable/bg_navigation"
android:gravity="center_horizontal"
android:orientation="horizontal" >

<com.dome.viewer.widget.MyRadioButton
android:id="@+id/buyHomeTab"
style="@style/radioButtonStyle"
android:layout_width="60dip"
android:layout_height="50dip"
android:background="@drawable/navigation_item"
android:checked="true"
attrstest:pic="@drawable/gcdt"
android:text="@string/home" />

<com.dome.viewer.widget.MyRadioButton
android:id="@+id/winAfficheTab"
style="@style/radioButtonStyle"
android:layout_width="60dip"
android:layout_height="50dip"
android:background="@drawable/navigation_item"
android:button="@null"
attrstest:pic="@drawable/kjgg"
android:text="@string/winAcciche" />

<com.dome.viewer.widget.MyRadioButton
android:id="@+id/integralTab"
style="@style/radioButtonStyle"
android:layout_width="65dip"
android:layout_height="50dip"
android:background="@drawable/navigation_item"
attrstest:pic="@drawable/jfdh"
android:text="@string/beanExchange" />

<com.dome.viewer.widget.MyRadioButton
android:id="@+id/accountTab"
style="@style/radioButtonStyle"
android:layout_width="60dip"
android:layout_height="50dip"
android:background="@drawable/navigation_item"
attrstest:pic="@drawable/yhzx"
android:text="@string/account" />

<com.dome.viewer.widget.MyRadioButton
android:id="@+id/moreTab"
style="@style/radioButtonStyle"
android:layout_width="60dip"
android:layout_height="50dip"
android:background="@drawable/navigation_item"
attrstest:pic="@drawable/more"
android:text="@string/more" />
</RadioGroup>

</RelativeLayout>

(6)、創建TabHostActivity:  
復制代碼 代碼如下:

package com.dome.viewer;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.RadioGroup;

public class TabHostActivity extends Activity {


@Override
protected void onStart() {
super.onStart();
}

private RadioGroup radioGroup;

// 頁卡內容
private ViewPager mPager;
// Tab頁面列表
private List<View> listViews;
// 當前頁卡編號
private LocalActivityManager manager = null;

private MyPagerAdapter mpAdapter = null;
private int index;

// 更新intent傳過來的值
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
}

@Override
protected void onSaveInstanceState(Bundle outState) {

}
@Override
public void onBackPressed() {
Log.i("","onBackPressed()");
super.onBackPressed();
}
@Override
protected void onPause() {
Log.i("","onPause()");
super.onPause();
}

@Override
protected void onStop() {
Log.i("","onStop()");
super.onStop();
}

@Override
protected void onDestroy() {
Log.i("","onDestroy()");
super.onDestroy();
}


@Override
protected void onResume() {
super.onResume();

if(getIntent() != null){
index = getIntent().getIntExtra("index", 0);
mPager.setCurrentItem(index);
setIntent(null);
}else{
if(index < 4){
index = index+1;
mPager.setCurrentItem(index);
index = index -1;
mPager.setCurrentItem(index);

}else if(index == 4){
index= index-1;
mPager.setCurrentItem(index);
index = index +1;
mPager.setCurrentItem(index);
}
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.tabhost);
mPager = (ViewPager) findViewById(R.id.vPager);
manager = new LocalActivityManager(this, true);
manager.dispatchCreate(savedInstanceState);
InitViewPager();
radioGroup = (RadioGroup) this.findViewById(R.id.rg_main_btns);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {

case R.id.buyHomeTab:
index = 0;
listViews.set(0, getView("A", new Intent(TabHostActivity.this, OneDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
mPager.setCurrentItem(0);
break;

case R.id.winAfficheTab:
index = 1;
listViews.set(1, getView("B", new Intent(TabHostActivity.this, TowDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
mPager.setCurrentItem(1);
break;

case R.id.integralTab:
index = 2;
listViews.set(2, getView("C", new Intent(TabHostActivity.this, ThreeDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
mPager.setCurrentItem(2);
break;

case R.id.accountTab:
index = 3;
listViews.set(3, getView("D", new Intent(TabHostActivity.this, FourDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
mPager.setCurrentItem(3);
break;

case R.id.moreTab:
index = 4;
listViews.set(4, getView("E", new Intent(TabHostActivity.this, FiveDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
mPager.setCurrentItem(4);
break;
default:
break;
}
}
});
}

/**
* 初始化ViewPager
*/
private void InitViewPager() {
Intent intent = null;
listViews = new ArrayList<View>();
mpAdapter = new MyPagerAdapter(listViews);
intent = new Intent(TabHostActivity.this, OneDomeActivity.class);
listViews.add(getView("A", intent));
intent = new Intent(TabHostActivity.this, TowDomeActivity.class);
listViews.add(getView("B", intent));
intent = new Intent(TabHostActivity.this, ThreeDomeActivity.class);
listViews.add(getView("C", intent));
intent = new Intent(TabHostActivity.this, FourDomeActivity.class);
listViews.add(getView("D", intent));
intent = new Intent(TabHostActivity.this, FiveDomeActivity.class);
listViews.add(getView("E", intent));
mPager.setOffscreenPageLimit(0);
mPager.setAdapter(mpAdapter);
mPager.setCurrentItem(0);
mPager.setOnPageChangeListener(new MyOnPageChangeListener());
}

/**
* ViewPager適配器
*/
public class MyPagerAdapter extends PagerAdapter {
public List<View> mListViews;

public MyPagerAdapter(List<View> mListViews) {
this.mListViews = mListViews;
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(mListViews.get(arg1));
}

@Override
public void finishUpdate(View arg0) {
}

@Override
public int getCount() {
return mListViews.size();
}

@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(mListViews.get(arg1), 0);
return mListViews.get(arg1);
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
}

@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}

@Override
public Parcelable saveState() {
return null;
}

@Override
public void startUpdate(View arg0) {
}
}

/**
* 頁卡切換監聽,ViewPager改變同樣改變TabHost內容
*/
public class MyOnPageChangeListener implements OnPageChangeListener {

public void onPageSelected(int arg0) {
manager.dispatchResume();
switch (arg0) {
case 0:
index = 0;
radioGroup.check(R.id.buyHomeTab);
listViews.set(0, getView("A", new Intent(TabHostActivity.this, OneDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
break;
case 1:
index = 1;
radioGroup.check(R.id.winAfficheTab);
listViews.set(1, getView("B", new Intent(TabHostActivity.this, TowDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
break;
case 2:
index = 2;
radioGroup.check(R.id.integralTab);
listViews.set(2, getView("C", new Intent(TabHostActivity.this, ThreeDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
break;
case 3:
index = 3;
radioGroup.check(R.id.accountTab);
listViews.set(3, getView("D", new Intent(TabHostActivity.this, FourDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
break;
case 4:
index = 4;
radioGroup.check(R.id.moreTab);
listViews.set(4, getView("E", new Intent(TabHostActivity.this, FiveDomeActivity.class)));
mpAdapter.notifyDataSetChanged();
break;
}
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
public void onPageScrollStateChanged(int arg0) {
}
}

private View getView(String id, Intent intent) {
return manager.startActivity(id, intent).getDecorView();
}

}

(7)、然后依次創建5個Activity作為頁卡,和創建5個xml作為Activity的布局文件,如圖:  

源碼下載 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久激情五月丁香伊人| 国产美女搞久久| 国产精品久久久久久av福利| 日韩精品欧美激情| 欧美成人高清视频| 中文字幕久久精品| 亚洲欧洲激情在线| 亚洲一区二区自拍| 国产精品久久久久999| 亚洲欧美精品一区| 久久综合网hezyo| 亚洲精品欧美极品| 97在线免费视频| 亚洲电影天堂av| 国产mv免费观看入口亚洲| 国产精品久久久久不卡| 亚洲女人被黑人巨大进入al| 日本一区二区在线播放| 中文字幕亚洲综合久久| 中文字幕欧美精品日韩中文字幕| 亚洲国产精品成人va在线观看| 国产精品尤物福利片在线观看| 日韩**中文字幕毛片| 亚洲免费av片| 欧美国产中文字幕| 亚洲91精品在线观看| 国产精品久久久久免费a∨大胸| 久久久久久久国产精品视频| 最近2019好看的中文字幕免费| 国产不卡精品视男人的天堂| 国产亚洲欧美日韩一区二区| 国产精品电影网| 久久久久久国产精品三级玉女聊斋| 97视频在线看| 中文字幕成人精品久久不卡| 国产精品免费福利| 亚洲国产私拍精品国模在线观看| 亚洲影院高清在线| 国产精品爽黄69天堂a| 亚洲黄色www| 欧美乱妇40p| 亚洲精品福利资源站| 日韩在线观看免费高清| 久久久电影免费观看完整版| 日本韩国在线不卡| 久久香蕉国产线看观看av| 亚洲精品国产精品国自产观看浪潮| 欧美中文字幕在线视频| 国产精品偷伦视频免费观看国产| 97超级碰碰碰| 国产精品亚洲片夜色在线| 欧美成人剧情片在线观看| 最近2019年好看中文字幕视频| www日韩中文字幕在线看| 欧美性生交xxxxxdddd| 久久99国产综合精品女同| 国产成人极品视频| 亚洲欧美资源在线| 欧美久久精品午夜青青大伊人| 久久精品国产成人| 国产va免费精品高清在线观看| 亚洲性日韩精品一区二区| 538国产精品一区二区在线| 国产精品欧美风情| 91精品久久久久久| 国产成人精品免费久久久久| 亚洲国产精品人人爽夜夜爽| 国产日产亚洲精品| 亚洲成人激情视频| 九九热这里只有在线精品视| 色狠狠久久aa北条麻妃| 欧美大全免费观看电视剧大泉洋| 欧美亚洲成人xxx| 亚洲国产高清福利视频| 国产精品福利网| 久久久久久久激情视频| 日韩高清av一区二区三区| 国产精品成人va在线观看| 国产亚洲精品久久| 亚洲的天堂在线中文字幕| 91高清视频在线免费观看| 9.1国产丝袜在线观看| 91视频国产高清| 亚洲成年人在线| 国产美女精彩久久| 久久国产精品视频| 亚洲国产精品va在线看黑人| 国产精品扒开腿做| 亚洲午夜精品久久久久久性色| 97碰碰碰免费色视频| 91青草视频久久| 有码中文亚洲精品| 日韩亚洲精品视频| 欧美亚洲国产成人精品| 欧美日韩亚洲一区二区三区| 国产精品久久久久久五月尺| 97色在线观看免费视频| 亚洲国产精品va在线| 成人在线播放av| 日韩在线视频国产| 精品国产乱码久久久久酒店| 久久免费视频这里只有精品| 91久久久久久久久久| 欧美精品日韩www.p站| 国产精品久在线观看| 91免费国产视频| 亚洲国产欧美一区| 久久久久国产一区二区三区| 红桃视频成人在线观看| 韩国精品美女www爽爽爽视频| 992tv在线成人免费观看| 欧美大尺度激情区在线播放| 91美女片黄在线观看游戏| 欧美最猛性xxxxx(亚洲精品)| 全亚洲最色的网站在线观看| 欧美日韩国产丝袜美女| 裸体女人亚洲精品一区| 精品无码久久久久久国产| 欧美亚洲视频在线观看| 久久免费在线观看| 亚洲黄色av网站| 成人激情在线观看| 成人黄色免费在线观看| 国产精品免费在线免费| 精品亚洲aⅴ在线观看| 激情成人中文字幕| 丝袜美腿精品国产二区| 777精品视频| 欧美日韩成人免费| 久久99久久99精品免观看粉嫩| 日韩综合视频在线观看| 久久在线免费观看视频| 91成人在线视频| 精品美女久久久久久免费| 欧美猛少妇色xxxxx| 色噜噜狠狠狠综合曰曰曰88av| 成人黄色片在线| 欧美丰满老妇厨房牲生活| 欧美性视频在线| 久久国内精品一国内精品| 日韩av一区在线| 中文字幕精品av| 亚洲欧洲在线看| 欧美激情图片区| 国产日韩在线视频| 国产精品永久免费观看| 欧美激情久久久| 欧美极品美女视频网站在线观看免费| 欧美亚洲国产视频小说| 亚洲成人在线视频播放| 午夜精品久久久久久久99热| 国产suv精品一区二区三区88区| 91精品成人久久| 亚洲国产精品悠悠久久琪琪| 欧美成人黄色小视频| 最近2019免费中文字幕视频三| 日韩在线免费观看视频| 91精品啪aⅴ在线观看国产| 午夜欧美大片免费观看| 国产成人久久久| 国产精品久久激情| 7m精品福利视频导航| 亚洲激情 国产| 国产精品一区二区三区久久久|