原来还有这货----CheckedTextView 此博文包含图片 (2013-08-23 14:37:59)

时间:2021-09-07 05:37:05

原来还有这货----CheckedTextView

  原来还有这货----CheckedTextView 此博文包含图片 (2013-08-23 14:37:59) (2013-08-23 14:37:59)
  分类: 技术相关
最近有任务要实现一个电信国际卡漫游设置界面,
最终的效果是这样的:
原来还有这货----CheckedTextView 此博文包含图片 (2013-08-23 14:37:59)


其中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那样的视觉效果,如下:
原来还有这货----CheckedTextView 此博文包含图片 (2013-08-23 14:37:59)
当用户点击到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 此博文包含图片 (2013-08-23 14:37:59)



很奇怪我所看到的安卓教材中没有看到有关CheckedTextView的介绍。。。

补充:
可以通过设置android:checkMark属性将CheckedTextView设置成多选风格
android:checkMark="?android:attr/listChoiceIndicatorMultiple"

而这个属性也是必须要设置的,否则CheckedTextView会不显示,在代码中可以通过setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)来设置。