商城項目實戰 | 12.1 實現自定義購物車數字加減控件

本文為菜鳥窩作者劉婷的連載。”商城項目實戰”系列來聊聊仿”京東淘寶的購物商城”如何實現。
每個程序猿必備的110本經典編程書,免費領取地址:http://mp.weixin.qq.com/s/cx433vAj_CDLzmhOoUS6zA
140套Android優秀開源項目源碼,領取地址:http://mp.weixin.qq.com/s/afPGHqfdiApALZqHsXbw-A
或歡迎勾搭運營小姐姐(微信 id:BT474849)免費領取哦~

在商城的購物車界面中,當為編輯模式的時候,可以對購物車中商品的購買數量進行加減,那么這個數字的加減控件是如何實現的呢?本篇文章就是要講解如何實現自定義的數字加減控件,先來看下效果圖。

[圖片上傳失敗...(image-5a416b-1565145943547)]

根據效果圖,我們可以看到這個數字加減控件是由加號、減號以及中間的數字三部分組成,另外我們還要分析下實現的這個控件需要實現具體怎樣的功能。

所要實現的功能

根據效果以及購物車的功能需求,分析得出自定義的數字加減控件需要如下的一些功能。

  1. 輸入框只能是數字,且不能通過鍵盤輸入。
  2. 通過加減按鈕操作數字。
  3. 監聽加減按鈕,同時對于點擊事件的監聽是可以擴展的。
  4. 數字有最小值和最大值的限制。
  5. 自定義屬性,包括設置背景、數字的字體大小等。

分析出來了需要實現怎樣的功能,那么下面就按照這種思路開始自定義控件。

實現自定義加減數字控件

1. 定義控件布局

加減就使用按鈕控件 Button,中間的數字因為是不可編輯的,所以就使用文本控件 TextView ,這里有兩個 Buton 以及一個 TextView,控件是水平方向擺放,下面是定義的 xml 布局。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="@dimen/layout_height"
android:background="@drawable/add_sub_number_selector"
android:padding="@dimen/border_width"
>
<Button
    android:id="@+id/view_btn_add"
    android:layout_width="@dimen/btn_add_width"
    android:layout_height="match_parent"
    android:text="+"
    android:gravity="center"
    android:layout_gravity="center"
    />

<View
    android:layout_width="@dimen/border_width"
    android:layout_height="match_parent"
    android:background="@color/common_border_color"
    android:gravity="center"
    android:layout_gravity="center"></View>

<TextView
    android:id="@+id/view_tv_num"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_gravity="center"
    android:textColor="#000"
    android:minWidth="@dimen/tv_number_width"
    />

<View
    android:layout_width="@dimen/border_width"
    android:layout_height="match_parent"
    android:background="@color/common_border_color"
    android:layout_gravity="center"
    android:gravity="center"></View>

<Button
    android:id="@+id/view_btn_sub"
    android:layout_width="@dimen/btn_add_width"
    android:layout_height="match_parent"
    android:text="-"
    android:gravity="center"
    android:layout_gravity="center"
    />
    </LinearLayout>

用于顯示加減的 Buton 以及顯示數字的 TextView 都寫好了,同時還添加兩條間隔線 View。

2. 定義控件屬性

新建一個 attrs.xml 文件,里面是用于放置自定義控件的一些自定義屬性,這里自定義的加減數字控件也自定義了一些屬性,寫在該文件中。

<resources>
<declare-styleable name="AddSubNumberLayout">
 <attr name="value" format="integer|reference"/>
    <attr name="minValue" format="integer|reference"/>
    <attr name="maxValue" format="integer|reference"/>
    <attr name="btnAddBackground" format="reference"/>
    <attr name="btnSubBackground" format="reference"/>
    <attr name="textViewBackground" format="reference"/>
    <attr name="btnAddTextColor" format="color|reference"/>
    <attr name="btnSubTextColor" format="color|reference"/>
    <attr name="textViewTextColor" format="color|reference"/>
    <attr name="btnAddTextSize" format="dimension|reference"/>
    <attr name="btnSubTextSize" format="dimension|reference"/>
    <attr name="textViewTextSize" format="dimension|reference"/>
</declare-styleable>
</resources>

自定義控件的屬性包括了設置初始數值、最小數值、最大值、給按鈕和文本控件設置背景、文字顏色以及文字大小。

3. 添加布局和聲明控件

之前我們已經寫好了布局文件了,然后讓自定義的控件繼承于 LinearLayout,同時添加布局文件,并且聲明控件。

    View view = mInflater.inflate(R.layout.view_add_sub_number_layout,this,true);
    btnAdd = (Button) view.findViewById(R.id.view_btn_add);
    btnSub = (Button) view.findViewById(R.id.view_btn_sub);
    tvNum = (TextView) view.findViewById(R.id.view_tv_num); 

布局文件的添加和控件聲明都要放在自定義控件初始化的時候,然后再對相關控件設置相關屬性和事件監聽。

4. 獲取屬性值設置自定義控件

上面已經定義了一些自定義的屬性,我們可以在外部對自定義的控件進行設置,而在自定義的控件中,我們也要獲取到對應的屬性值。

if (attrs != null){
        TintTypedArray array = TintTypedArray.obtainStyledAttributes(context,attrs, R.styleable.AddSubNumberLayout, defStyleAttr,0);
        int value = array.getInt(R.styleable.AddSubNumberLayout_value,1);
        setValue(value);

        int minVal =  array.getInt(R.styleable.AddSubNumberLayout_minValue,1);
        setMinValue(minVal);

        int maxVal =  array.getInt(R.styleable.AddSubNumberLayout_maxValue,1);
        setMaxValue(maxVal);

        Drawable drawableBtnAdd =array.getDrawable(R.styleable.AddSubNumberLayout_btnAddBackground);
        Drawable drawableBtnSub =array.getDrawable(R.styleable.AddSubNumberLayout_btnSubBackground);
        Drawable drawableTextView =array.getDrawable(R.styleable.AddSubNumberLayout_textViewBackground);

        setButtonAddBackground(drawableBtnAdd);
        setButtonSubBackground(drawableBtnSub);
        setTexViewBackground(drawableTextView);

        setBtnAddTextColor(array.getColor(R.styleable.AddSubNumberLayout_btnAddTextColor, Color.BLACK));
        setBtnSubTextColor(array.getColor(R.styleable.AddSubNumberLayout_btnSubTextColor,Color.BLACK));
        setTextViewTextColor(array.getColor(R.styleable.AddSubNumberLayout_textViewTextColor,Color.BLACK));

        setBtnAddTextSize(array.getDimension(R.styleable.AddSubNumberLayout_btnAddTextSize,R.dimen.btn_add_text_size));
        setBtnSubTextSize(array.getDimension(R.styleable.AddSubNumberLayout_btnSubTextSize,R.dimen.btn_add_text_size));
        setTextViewTextSize(array.getDimension(R.styleable.AddSubNumberLayout_textViewTextSize,R.dimen.btn_add_text_size));

        array.recycle();
    }

根據接收的屬性值,可以對自定義控件中的數字、加減控件樣式等進行一定的設置來達到我們所希望的效果。

5. 添加加減事件監聽

事件的監聽,主要是分為加和減的事件監聽,加的時候,我們當然是希望數字要遞增,但是不要超過了最大數值,減的時候則是數字遞減,但是不要低于最小數值,這里先寫好數字加和減的方法。
數字遞增變化的方法如下。

private void numAdd(){

    if(value<maxValue)
        value=value+1;
    else
        Toast.makeText(getContext(),"不能再加了",Toast.LENGTH_SHORT).show();

    tvNum.setText(value+"");
} 

這里的 maxValue 就是最大數值,而 value 就是當前的數值,數值加后要修改 tvNum 的數字顯示。

數字減的方法如下。

private void numSub(){

    if(value>minValue)
        value=value-1;
    else
        Toast.makeText(getContext(),"不能再減了",Toast.LENGTH_SHORT).show();

    tvNum.setText(value+"");
}

minValue 是最小值,而 value 就是當前數值,數值減少了,最后顯示在 tvNum 上。

數字的加減方法寫好了,這兩個方法都要在加減 Button 的點擊事件中調用,但是我們在處理加減事件的時候,可能不僅僅是要對數字進行加減,還有其他的操作,這里就希望監聽事件是可以擴展的,使用 interface 來擴展。
定義的監聽事件接口如下。

public interface  OnButtonClickListener{

    void onButtonAddClick(View view,int value);
    void onButtonSubClick(View view,int value);
}

并且這里的接口要在按鈕的點擊事件中調用。

btnAdd.setOnClickListener(this);
btnSub.setOnClickListener(this);

@Override
public void onClick(View v) {

    if (v.getId() == R.id.view_btn_add) {

        numAdd();
        if (mOnButtonClickListener != null) {

            mOnButtonClickListener.onButtonAddClick(v,value);
        }

    } else if (v.getId() == R.id.view_btn_sub) {

        numSub();

        if (mOnButtonClickListener != null) {

            mOnButtonClickListener.onButtonSubClick(v,value);
        }
    }
}

最后一步就是要為事件的調用添加提供一個方法。

public void setOnButtonClickListener(OnButtonClickListener onButtonClickListener) {
    this.mOnButtonClickListener = onButtonClickListener;
}

這樣的話事件的處理就完成了,我們如果要為自定義的控件添加監聽事件的話,就直接調用 setOnButtonClickListener() 方法就好了。

使用自定義的控件

1. 添加自定義控件到布局中

新建 Activity/Fragment ,將已經定義好的自定義數字控件添加到布局中,并且設置自定義控件的一些屬性。

<com.liuting.textexample.widget.AddSubNumberLayout
    android:id="@+id/add_sub_number_layout_main"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:value="1"
    app:maxValue="1"
    app:minValue="1"
    app:btnAddBackground="@android:color/white"
    app:btnSubBackground="@android:color/white"
    app:textViewBackground="@android:color/white"
    app:textViewTextSize="16sp"
    app:btnSubTextSize="22sp"
    app:btnAddTextSize="22sp"
    app:btnAddTextColor="@color/common_border_color"
    app:btnSubTextColor="@color/common_border_color">

寫好了布局后,將布局添加到 Activity/Fragment 中,運行直接就可以看到效果了。

2. 效果圖

運行代碼,獲取效果圖。

[圖片上傳失敗...(image-f3ae94-1565145943547)]

這是自定義好的加減數字控件的簡單展示了,后期將會使用到商城的購物車模塊中,用于對商品的編輯。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容