实现按钮式单选

很多时候,老大可能会要求你做出这样的单选效果,如下图:




小弟想到三种方法来实现,在此献丑总结一下。


一、最省事省力的一种

使用RadioGroup,只要轻轻地对RadioGroup进行适当的设置,就能达到这样的效果了,请见下面的xml文件:

	<RadioGroup
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_marginTop="8dp"
		android:checkedButton="@+id/btn_one"
		android:orientation="horizontal" >
		<RadioButton
			android:id="@id/btn_one"
			android:layout_width="0dp"
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:background="@drawable/selector_bg_choice"
			android:button="@null"
			android:gravity="center"
			android:minHeight="48dp"
			android:text="Male"
			android:textColor="@drawable/selector_text_color"
			android:textSize="16sp"
			android:textStyle="bold" />
		<RadioButton
			android:id="@+id/btn_two"
			android:layout_width="0dp"
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:background="@drawable/selector_bg_choice"
			android:button="@null"
			android:gravity="center"
			android:minHeight="48dp"
			android:text="Female"
			android:textColor="@drawable/selector_text_color"
			android:textSize="16sp"
			android:textStyle="bold" />
	</RadioGroup>

其中,使用到的两个selector,如下:

背景颜色:selector_bg_choice.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 点击用 -->
	<item android:drawable="@color/green" android:state_pressed="true"/>
	<!-- CheckBox/RadioButton用 -->
	<item android:drawable="@color/green" android:state_checked="true"/>
	<!-- TabWidget用 -->
	<item android:drawable="@color/green" android:state_selected="true"/>
	<item android:drawable="@color/white"/>
</selector>

文字颜色:selector_text_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:state_pressed="true" android:color="@color/white"/>
	<item android:state_checked="true" android:color="@color/white"/>
	<item android:state_selected="true" android:color="@color/white"/>
	<item android:color="@color/black"/>
</selector>

PS:看了大家会发现,两个selector中,为啥一个是android:drawable另一个是android:color呢?

这是由使用到它的地方决定的,第一个selector使用在android:backgroud属性,这个属性需要一个drawable;而第二个selector使用在android:textColor,这个属性需要一个color。


二、较省力的一种

使用多个CheckBox(或者ToggleButton),布局如下:

	<LinearLayout
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_marginTop="8dp"
		android:orientation="horizontal" >
		<CheckBox
			android:id="@+id/cb_one"
			android:layout_width="0dp"
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:background="@drawable/selector_bg_choice"
			android:button="@null"
			android:checked="true"
			android:gravity="center"
			android:minHeight="48dp"
			android:text="Male"
			android:textColor="@drawable/selector_text_color"
			android:textSize="16sp"
			android:textStyle="bold" />
		<CheckBox
			android:id="@+id/cb_two"
			android:layout_width="0dp"
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:background="@drawable/selector_bg_choice"
			android:button="@null"
			android:gravity="center"
			android:minHeight="48dp"
			android:text="Female"
			android:textColor="@drawable/selector_text_color"
			android:textSize="16sp"
			android:textStyle="bold" />
		<CheckBox
			android:id="@+id/cb_three"
			android:layout_width="0dp"
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:background="@drawable/selector_bg_choice"
			android:button="@null"
			android:gravity="center"
			android:minHeight="48dp"
			android:text="None"
			android:textColor="@drawable/selector_text_color"
			android:textSize="16sp"
			android:textStyle="bold" />
	</LinearLayout>

但还需要在程序里进行一些小设置:

		// 第二种方法:使用多个CheckBox实现
		CheckBox cb1 = (CheckBox) findViewById(R.id.cb_one);
		CheckBox cb2 = (CheckBox) findViewById(R.id.cb_two);
		CheckBox cb3 = (CheckBox) findViewById(R.id.cb_three);
		cb1.setOnClickListener(this);
		cb2.setOnClickListener(this);
		cb3.setOnClickListener(this);
		mChecks = new CheckBox[] { cb1, cb2, cb3 };

	@Override
	public void onClick(View v) {
		for (CheckBox cb : mChecks) {
			cb.setChecked(v == cb);
		}
	}
 在程序中,需要保证只有一个CheckBox被check,就酱。


三、比较蛋碎的一种实现,但也能达到效果。

就是使用TabHost/TabWidget

	<TabHost
		android:id="@+id/th_tabhost"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_marginTop="8dp" >
		<TabWidget
			android:id="@android:id/tabs"
			android:layout_width="match_parent"
			android:layout_height="wrap_content" />
		<FrameLayout
			android:id="@android:id/tabcontent"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:visibility="gone" />
	</TabHost>

		// 第三种方法:使用TabHost实现
		TabHost tabhost = (TabHost) findViewById(R.id.th_tabhost);
		tabhost.setup();
		tabhost.addTab(tabhost.newTabSpec("male").setIndicator(newTab("Male")).setContent(mTabContentFactory));
		tabhost.addTab(tabhost.newTabSpec("female").setIndicator(newTab("Female")).setContent(mTabContentFactory));
	}

	private TabContentFactory mTabContentFactory = new TabContentFactory() {

		@Override
		public View createTabContent(String tag) {
			return new View(MainActivity.this);
		}
	};

	private View newTab(String text) {
		LayoutInflater inflater = LayoutInflater.from(this);
		TextView tv = (TextView) inflater.inflate(R.layout.layout_tab, null);
		tv.setText(text);
		return tv;
	}

这种方法就有点浪费资源了,毕竟TabHost不是为了实现这么一个小功能的...



好吧,写这篇文章,其一的目的是想让大家了解下selector的作用,这可是个好东东啊,不要拘泥于eclipse提示的属性,除了drawable,还可以写别的属性的!再者,就是希望大家多去了解Android原生的控件和它们的属性,用原生的组件变化、组合成自己想要的控件,也是一件很有意思的事情。


demo下载:http://download.csdn.net/detail/ueryueryuery/7729883


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值