• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Codejie's C++ Space

            Using C++

            Android DEV : Custom new state for TextView


                Android中的常用View, 如TextView, Button等, 都有state概念 -- state_pressed, state_selected, state_enabled等等, 這些狀態(tài)都是boolean類型的變量, 可以通過其set/get方法讀取或者設(shè)置這些狀態(tài).
                狀態(tài)的概念在其他平臺或者GUI庫中都是存在的, 因?yàn)檫@些是View的基本屬性, 但Android中將其與View的Color/Drawable屬性捆綁起來的做法極大地簡化了UI中維護(hù)狀態(tài)變化與其它屬性變化的操作. 具體可參看如下Android文檔 -- ColorStateList.

                Android的TextView自身提供了很多state, 比如state_selected. 在實(shí)際使用中, 我們可以通過此屬性, 結(jié)合selector一起來實(shí)現(xiàn)某些需求 -- 同一字符串通過二元的顏色來標(biāo)明狀況的不同, 如一封郵件是否讀取過等等. 但如果此時(shí)使用state_selected會引起個(gè)問題 -- 如果此時(shí)真的'選中'了當(dāng)前的TextView, 就會引起不必要的'混亂'. 這是因?yàn)橄到y(tǒng)的'選中', 如使用方向鍵選中, 和代碼中的setSelected()是有相同效果的. 此時(shí)有何感想? 是不是真心覺得state不夠用呢?  因此 -- 

                今天咱們聊個(gè)好玩的 -- 自己定制state!

               基本思想很簡單 -- state是View的屬性項(xiàng), 那么為了定制state, 只需為View創(chuàng)建相應(yīng)的新的state屬性項(xiàng), 然后封裝個(gè)能處理此屬性的TextView類即可.

               1. 定義新的state屬性項(xiàng)
                   在attrs.xml中(其實(shí)什么xml都可以, 只要放到res下能看到就好)定義新的state屬性.
            <?xml version="1.0" encoding="utf-8"?>
            <resources>
                <declare-styleable name="MyCustomTextView">
                    <attr name="state_unread" format="boolean" />
                </declare-styleable>
            </resources>

                2. 創(chuàng)建新的TextView類
                    繼承與TextView類, 創(chuàng)建自定義TextView類以處理新的state屬性.
            public class MyCustomTextView extends TextView {
                
                

                private static final int[] STATE_UNREAD = { R.attr.state_unread };
                
                private boolean mIsUnread = false;
                
                
                
                public void setUnreadState(boolean isUnread) {
                    mIsUnread = isUnread;
                    refreshDrawableState();
                }
                
                @Override
                protected int[] onCreateDrawableState(int extraSpace) {
                    final int[] state = super.onCreateDrawableState(extraSpace + 1);
                    if (mIsUnread) {
                        mergeDrawableStates(state, STATE_UNREAD);
                    }
                    return state;
                }
            }
                   
                    a. 定義狀態(tài)屬性項(xiàng) -- private static final int[] STATE_UNREAD = { R.attr.state_unread };
                    b. 定義狀態(tài)變量 -- private boolean mIsUnread = false;
                    c. 新屬性set函數(shù) -- setUnreadState()
                    d. 添加新屬性支持 -- 重載onCreateDrawableState()
                    e. 搞定

                3. 在selector添加新屬性
            <?xml version="1.0" encoding="utf-8"?>
            <selector xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:custom
            ="http://schemas.android.com/apk/res-auto" >
                <item custom:state_unread="true" android:color="@color/theme_1" />
                <item android:state_selected="true" android:color="@color/theme_2" />
                <item android:color="@color/theme_0" />    
            </selector>
                    因?yàn)檫@個(gè)state_unread屬性是自定義的, 所以要注意添加其ns, 不然會有編譯錯(cuò)誤 -- 無法找到xxxx定義.


                Andoird的View提供了靈活的定制功能, 除了state可以如上自定義外, 其它的屬性, 比如Font什么的, 都是可以通過此方式實(shí)現(xiàn)自定義屬性添加的. 反過來, 為了'漂亮'的UI, app所使用的View最好都是'自定義'過的, 哪怕初始只是個(gè)簡單的繼承類, 等到'未來'需要擴(kuò)展時(shí), 你就懂了, 嘿嘿...


            posted on 2013-10-09 17:37 codejie 閱讀(1300) 評論(0)  編輯 收藏 引用 所屬分類: G7

            公告

            Using C++

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(73)

            隨筆分類(513)

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            www亚洲欲色成人久久精品| 亚洲AV无码久久精品狠狠爱浪潮| 精品久久8x国产免费观看| 欧美一区二区三区久久综合| av午夜福利一片免费看久久| 国产精品女同一区二区久久| 婷婷久久五月天| 精品久久久久久成人AV| 国产成人精品综合久久久| 亚洲国产成人久久综合区| 久久久久亚洲av无码专区喷水| 久久午夜电影网| 久久久久久国产精品无码下载 | 美女久久久久久| 日韩人妻无码精品久久久不卡| 精品久久久久久无码人妻蜜桃| 色综合合久久天天给综看| 色欲久久久天天天综合网精品| 青青青国产成人久久111网站| 久久婷婷午色综合夜啪| 青青青国产成人久久111网站| 久久人人爽人人爽人人av东京热| 麻豆精品久久精品色综合| 蜜臀av性久久久久蜜臀aⅴ| 开心久久婷婷综合中文字幕| 婷婷久久综合九色综合98| 久久这里有精品| 亚洲精品美女久久久久99小说| 久久精品国产99国产精品澳门| 97精品依人久久久大香线蕉97| 久久99精品久久久久久9蜜桃| 久久99国产精品久久99| 久久天天躁狠狠躁夜夜躁2014| 久久综合一区二区无码| 久久精品国产黑森林| 很黄很污的网站久久mimi色| 色综合久久中文色婷婷| 久久国产精品-久久精品| 青青热久久综合网伊人| 伊人久久综合热线大杳蕉下载| av无码久久久久不卡免费网站|