自定義控件之購物車數(shù)量加減

Paste_Image.png
創(chuàng)建自定義控件的布局文件number_add_sub_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:background="@drawable/number_add_sub_view_selector"
    android:gravity="center"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:paddingLeft="@dimen/value_10dp"
        android:paddingRight="@dimen/value_10dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tv_value"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1"
            android:textColor="@color/txt_gray_c"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_num_units"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="單位"
            android:textColor="@color/txt_gray_c"
            android:textSize="@dimen/value_14sp" />

    </LinearLayout>


    <View
        android:layout_width="@dimen/value_1dp"
        android:layout_height="match_parent"
        android:background="@color/txt_gray_a"
        android:layout_marginTop="@dimen/value_3dp"
        android:layout_marginBottom="@dimen/value_3dp"
        />

    <TextView
        android:id="@+id/btn_sub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="@dimen/value_10dp"
        android:paddingRight="@dimen/value_10dp"
        android:gravity="center"
        android:text="-"
        android:textColor="@color/txt_gray_d"
        android:textSize="25sp" />


    <TextView
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:paddingLeft="@dimen/value_10dp"
        android:paddingRight="@dimen/value_10dp"
        android:text="+"
        android:textColor="@color/txt_gray_d"
        android:textSize="25sp" />
</LinearLayout>
布局中用到控件的選擇器请祖,整體布局的邊框線number_add_sub_view_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <!--設(shè)置圓角-->
    <corners android:radius="2dp"></corners>
    <!--設(shè)置固定背景顏色-->
    <solid android:color="#ffffff"></solid>
    <!--設(shè)置邊框顏色-->
    <stroke android:color="#dddddd" android:width="1dp"></stroke>
</shape>
按鈕控件的按下背景顏色選擇器btn_number_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!--沒按下狀態(tài)-->
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="#7fd8d8d8"></solid>
        </shape>
    </item>

    <!--按下狀態(tài)-->
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#ffd8d8d8"></solid>
        </shape>
    </item>

    <!--默認狀態(tài)-->
    <item >
        <shape android:shape="rectangle">
            <solid android:color="#ffffff"></solid>
        </shape>
    </item>

</selector>
自定義一個類編寫該布局文件的邏輯操作形成自定義的控件,布局的父控件是線性布局,所以新建一個類繼 承線性布局NumberAddSubView

步驟1:創(chuàng)建一個類,并且把布局與該類形成一個整體
View.inflate(context,R.layout.number_add_sub_view,this);
這一句代碼是關(guān)鍵署咽,里面的最后一個參數(shù)this就是把這個類和布局文件number_add_sub_view形成一個整體哪痰。

public class NumberAddSubView extends LinearLayout{
    public NumberAddSubView(Context context) {
        this(context,null);
    }

    public NumberAddSubView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public NumberAddSubView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //要讓布局和當前類形成一個整體
        View view = View.inflate(context,R.layout.number_add_sub_view,this);
    }
}

步驟二、控件的邏輯處理桐罕,并且定義接口回調(diào)響應(yīng)控件

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 自定義數(shù)字加減控件
 * Created by willkong on 2016/12/14.
 */

public class NumberAddSubView extends LinearLayout implements View.OnClickListener {
    private Button btn_sub;
    private Button btn_add;
    private TextView tv_value;
    //屬性監(jiān)聽
    private int value = 1;//默認值
    private int minValue = 1;//最小值
    private int maxValue = 10;//最大值

    public int getMaxValue() {
        return maxValue;
    }

    public void setMaxValue(int maxValue) {
        this.maxValue = maxValue;
    }

    public int getValue() {
        String valueStr = tv_value.getText().toString().trim();//文本的內(nèi)容
        if (!TextUtils.isEmpty(valueStr)){
            value = Integer.valueOf(valueStr);
        }
        return value;
    }

    public void setValue(int value) {
        this.value = value;
        tv_value.setText(value+"");
    }

    public int getMinValue() {
        return minValue;
    }

    public void setMinValue(int minValue) {
        this.minValue = minValue;
    }

    public NumberAddSubView(Context context) {
        this(context, null);
    }

    public NumberAddSubView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NumberAddSubView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //要讓布局和當前類形成一個整體
        View.inflate(context, R.layout.number_add_sub_view, this);
        btn_sub = (Button) findViewById(R.id.btn_sub);
        btn_add = (Button) findViewById(R.id.btn_add);
        tv_value = (TextView) findViewById(R.id.tv_value);
        getValue();//獲得當前值
        //設(shè)置點擊事件
        btn_add.setOnClickListener(this);
        btn_sub.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_sub://減
                subNumber();
                if (listener != null){
                    listener.onButtonSub(v,value);
                }
                break;
            case R.id.btn_add://加
                addNumber();
                if (listener != null){
                    listener.onButtonAdd(v,value);
                }
                break;
        }
    }

    /**
     * 減
     */
    private void subNumber() {
        if (value > minValue){
            value -= 1;
        }
        setValue(value);
    }

    /**
     * 加
     */
    private void addNumber() {
        if (value < maxValue){
            value += 1;
        }
        setValue(value);
    }

    /**
     * 監(jiān)聽數(shù)字增加減少控件
     */
    public interface OnNumberClickListener{
        /**
         * 當減少按鈕被點擊的時候回調(diào)
         * @param view
         * @param value
         */
        void onButtonSub(View view,int value);
        /**
         * 當增加按鈕被點擊的時候回調(diào)
         * @param view
         * @param value
         */
        void onButtonAdd(View view,int value);
    }

    public OnNumberClickListener listener;

    /**
     * 設(shè)置監(jiān)聽數(shù)字按鈕
     * @param listener
     */
    public void setOnNumberClickListener(OnNumberClickListener listener){
        this.listener = listener;
    }
}

步驟三脉让、自定義控件屬性
新建一個attrs文件,名稱自定義如:number_add_sub_view_attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="NumberAddSubView">
        <attr name="value" format="integer|reference"></attr>
        <attr name="minValue" format="integer|reference"></attr>
        <attr name="maxValue" format="integer|reference"></attr>
        <attr name="NumberAddSubBackground" format="reference"></attr>
        <attr name="NumberAddBackground" format="reference"></attr>
        <attr name="NumberSubBackground" format="reference"></attr>
        <attr name="NumberUnits" format="string|reference"></attr>
    </declare-styleable>
</resources>

步驟四功炮、在自定義類中獲取屬性

package com.szputy.print.view;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.widget.TintTypedArray;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.szputy.print.R;

/**
 * 自定義數(shù)字加減控件
 * @author  zhangjy
 * @time 2017/1/19 12:46
 **/
public class NumberAddSubView extends LinearLayout implements View.OnClickListener{

    private TextView btn_sub;
    private TextView btn_add;
    private TextView numUnits;
    private TextView tv_value;
    //屬性監(jiān)聽
    private int value = 1;//默認值
    private int minValue = 1;//最小值
    private int maxValue = 10;//最大值

    public NumberAddSubView(Context context) {
        this(context,null);
    }

    public NumberAddSubView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public int getMaxValue() {
        return maxValue;
    }

    public void setMaxValue(int maxValue) {
        this.maxValue = maxValue;
    }

    public int getValue() {
        String valueStr = tv_value.getText().toString().trim();//文本的內(nèi)容
        if (!TextUtils.isEmpty(valueStr)){
            value = Integer.valueOf(valueStr);
        }
        return value;
    }

    public void setValue(int value) {
        this.value = value;
        tv_value.setText(value+"");
    }

    public int getMinValue() {
        return minValue;
    }

    public void setMinValue(int minValue) {
        this.minValue = minValue;
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public NumberAddSubView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //要讓布局和當前類形成一個整體
        View.inflate(context, R.layout.number_add_sub_view, this);
        btn_sub = (TextView) findViewById(R.id.btn_sub);
        btn_add = (TextView) findViewById(R.id.btn_add);
        numUnits = (TextView)findViewById(R.id.tv_num_units);
        tv_value = (TextView) findViewById(R.id.tv_value);
        getValue();//獲得當前值
        //設(shè)置點擊事件
        btn_add.setOnClickListener(this);
        btn_sub.setOnClickListener(this);

        //得到屬性
        if (attrs != null) {
            TintTypedArray typedArray = TintTypedArray.obtainStyledAttributes
                    (context, attrs, R.styleable.NumberAddSubView);
            int value = typedArray.getInt(R.styleable.NumberAddSubView_value, 0);
            if (value > 0) {
                setValue(value);
            }
            int minValue = typedArray.getInt(R.styleable.NumberAddSubView_minValue, 0);
            if (minValue > 0) {
                setMinValue(minValue);
            }
            int maxValue = typedArray.getInt(R.styleable.NumberAddSubView_maxValue, 0);
            if (maxValue > 0) {
                setMaxValue(maxValue);
            }

            Drawable numberAddSubBackground = typedArray.getDrawable

                    (R.styleable.NumberAddSubView_NumberAddSubBackground);
            if (numberAddSubBackground != null) {
                setBackground(numberAddSubBackground);
            }
            Drawable numberAddBackground = typedArray.getDrawable

                    (R.styleable.NumberAddSubView_NumberAddBackground);
            if (numberAddBackground != null) {
                btn_add.setBackground(numberAddBackground);
            }
            Drawable numberSubBackground = typedArray.getDrawable
                    (R.styleable.NumberAddSubView_NumberSubBackground);
            if (numberSubBackground != null) {
                btn_sub.setBackground(numberSubBackground);
            }

            String numberUnits = typedArray.getString(R.styleable.NumberAddSubView_NumberUnits);
            if (numberUnits != null) {
                numUnits.setText(numberUnits);
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_sub://減
                subNumber();
                if (listener != null){
                    listener.onButtonSub(v,value);
                }
                break;
            case R.id.btn_add://加
                addNumber();
                if (listener != null){
                    listener.onButtonAdd(v,value);
                }
                break;
        }
    }

    /**
     * 減
     */
    private void subNumber() {
        if (value > minValue){
            value -= 1;
        }
        setValue(value);
    }

    /**
     * 加
     */
    private void addNumber() {
        if (value < maxValue){
            value += 1;
        }
        setValue(value);
    }

    /**
     * 監(jiān)聽數(shù)字增加減少控件
     */
    public interface OnNumberClickListener{
        /**
         * 當減少按鈕被點擊的時候回調(diào)
         * @param view
         * @param value
         */
        void onButtonSub(View view,int value);
        /**
         * 當增加按鈕被點擊的時候回調(diào)
         * @param view
         * @param value
         */
        void onButtonAdd(View view,int value);
    }

    public OnNumberClickListener listener;

    /**
     * 設(shè)置監(jiān)聽數(shù)字按鈕
     * @param listener
     */
    public void setOnNumberClickListener(OnNumberClickListener listener){
        this.listener = listener;
    }
}

至此溅潜,購物車的自定義數(shù)字加減控件就完成了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薪伏,一起剝皮案震驚了整個濱河市滚澜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫁怀,老刑警劉巖设捐,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件借浊,死亡現(xiàn)場離奇詭異,居然都是意外死亡萝招,警方通過查閱死者的電腦和手機蚂斤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槐沼,“玉大人曙蒸,你說我怎么就攤上這事「诠常” “怎么了纽窟?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凹嘲。 經(jīng)常有香客問我师倔,道長,這世上最難降的妖魔是什么周蹭? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任趋艘,我火速辦了婚禮,結(jié)果婚禮上凶朗,老公的妹妹穿的比我還像新娘瓷胧。我一直安慰自己,他們只是感情好棚愤,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布搓萧。 她就那樣靜靜地躺著,像睡著了一般宛畦。 火紅的嫁衣襯著肌膚如雪瘸洛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天次和,我揣著相機與錄音反肋,去河邊找鬼。 笑死踏施,一個胖子當著我的面吹牛石蔗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畅形,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼养距,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了日熬?” 一聲冷哼從身側(cè)響起棍厌,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后定铜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳液,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年揣炕,在試婚紗的時候發(fā)現(xiàn)自己被綠了帘皿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡畸陡,死狀恐怖鹰溜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丁恭,我是刑警寧澤曹动,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站牲览,受9級特大地震影響墓陈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜第献,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一贡必、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庸毫,春花似錦仔拟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至载佳,卻和暖如春炒事,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔫慧。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工羡洛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藕漱。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像崭闲,于是被迫代替她去往敵國和親肋联。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容