原来还有这货----CheckedTextView
(2013-08-23 14:37:59)分类: 技术相关 |
最近有任务要实现一个电信国际卡漫游设置界面,
当用户点击到CheckBox上时,整个模块也会有一个pressed效果,用户点击到文字上时,CheckBox也会同时有一个pressed效果。这样实现起来就比较麻烦了。。。。因为当时我也不知道CheckedTextView这个控件。。。
最终的效果是这样的:
其中Global mode、Cdma only、Gsm only,这块的实现当时难倒了我,杭州的同事先做好了一个demo,但是效果并不能让我满意,是这样实现的
android:id="@+id/roam_global"
android:layout_width="match_parent"
android:layout_height="48dip"
android:orientation="horizontal">
android:layout_width="0dip"
android:layout_height="48dip"
android:layout_weight="1"
android:paddingLeft="16dip"
android:text="@string/global_mode"
android:textAppearance="?android:attr/
android:id="@+id/roam_select_radio_global"
android:layout_width="wrap_content"
android:layout_height="48dip"
android:paddingRight="
用LinearLayout包裹一个TextView和一个RadioButton,这样界面上确实能够满足要求,但是用户体验上有大问题,首先用户要点击到RadioButton那一很小的区域内才算选定这项,当用户点击到TextView上没有反应,其次,我要实现想普通的CheckBoxPreference那样的视觉效果,如下:
当用户点击到CheckBox上时,整个模块也会有一个pressed效果,用户点击到文字上时,CheckBox也会同时有一个pressed效果。这样实现起来就比较麻烦了。。。。因为当时我也不知道CheckedTextView这个控件。。。
首先RadioButton的实现是图片在左,文字在右,虽然这个可以通过设置
android:button="@null"
android:drawableRight="@android:drawable/btn_radio"
来实现将图片放在文字右边,但是想实现像上面那样使图片和文字之间的padding自适应就很难了。
其次发现一个比较有用的属性,android:duplicateParentState,通过设置这个属性到RadioButton,再把包裹RadioButton的android:clickable设为true,可以实现当press文字时使RadioButton呈现pressed效果。但是反过来,当press RadioButton时如何使整个LinearLayout呈现出pressed效果????
其实我想实现的不过就是AlertDialog中一个单选列表的效果,于是跟踪android AlertDialog源码,发现单选列表中的单个项是通过CheckedTextView来实现的,每个列表项的布局文件是frameworks\base\core\res\res\layout\select_dialog_singlechoice.xml
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
android:paddingStart="12dip"
android:paddingEnd="7dip"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:ellipsize="marquee"
/>
再加上一个background属性就可以完成需求了:
android:background="?android:attr/selectableItemBackground"
很奇怪我所看到的安卓教材中没有看到有关CheckedTextView的介绍。。。
补充:
可以通过设置android:checkMark属性将CheckedTextView设置成多选风格
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
而这个属性也是必须要设置的,否则CheckedTextView会不显示,在代码中可以通过setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)来设置。