利用观察者(Observer)和被观察者(Observable)实现监听操作

来源:互联网 发布:薛之谦男装淘宝店铺 编辑:程序博客网 时间:2024/06/06 19:13

老规矩上图:

这里写图片描述

第一步:上布局视图只贴一部分

 <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="#f6534c"        android:orientation="vertical">        <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginLeft="20dp"            android:layout_marginTop="20dp"            android:orientation="horizontal">            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="总财富"                android:textColor="#fcc7c6" />            <!--注册checkBox为被观察者-->            <com.example.hxl.observerdemo.CheckBoxObservable                android:id="@+id/checkBoxObservable"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginLeft="5dp"                android:button="@drawable/bg_checkbox_sel" />            <!-- checkBox:xml中内部实现点击事件  android:button="@drawable/bg_checkbox_sel"-->        </LinearLayout>        <RelativeLayout            android:layout_width="match_parent"            android:layout_height="wrap_content">            <LinearLayout                android:id="@+id/my_assert_total_account_layout"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:orientation="vertical">                <!--让总财富下的textView,成为观察者-->                <com.example.hxl.observerdemo.TextViewObserver                    android:id="@+id/my_assert_total_account"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_marginBottom="10dp"                    android:layout_marginLeft="20dp"                    android:layout_marginTop="10dp"                    android:text="0.00"                    android:textColor="#fccbca"                    android:textSize="32sp" />                <TextView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_marginLeft="20dp"                    android:paddingBottom="2dp"                    android:text="(交易确认中或暂无资产)"                    android:textColor="#ffffff"                    android:textSize="12sp" />            </LinearLayout>            <ImageView                android:id="@+id/total_account_hider"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:src="@drawable/wealth_hidden"                android:visibility="invisible" />        </RelativeLayout>    </LinearLayout>

第二步:被观察者

/** * 实现观察者模式的被观察者 * 让checkBox成为被观察者 */public class CheckBoxObservable extends CheckBox implements CompoundButton.OnCheckedChangeListener{    private ObservableInner mObservable;    public CheckBoxObservable(Context context) {        super(context);        init();    }    public CheckBoxObservable(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public CheckBoxObservable(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    private void hide() {        // 状态改变 ,数据改变        setChanged();        //发送信息告诉观察者,只有为真时,才会调用观察者的update方法        notifyObservers(true);    }    private void show() {        setChanged();  // 状态改变,必须调用        notifyObservers(false);    }    //初始化操作    public void init() {        //创建被观察者        mObservable = new ObservableInner();        //设置被观察者状态改变监听        setOnCheckedChangeListener(this);    }    //添加观察者    public void addObserver(Observer observer){        mObservable.addObserver(observer);    }    //删除某一个具体的观察者    public void deleteObserver(Observer observer) {        mObservable.deleteObserver(observer);    }    //删除所有的观察者    public void deleteObservers() {        mObservable.deleteObservers();    }    //返回列表中所有的添加观察者    public int countObservers(){        return mObservable.countObservers();    }    //通知刷新所有的观察者    public void notifyObservers(){        mObservable.notifyObservers();    }    public void notifyObservers(Object data){        mObservable.notifyObservers(data);    }    public boolean hasChanged() {        return mObservable.hasChanged();    }    protected void setChanged() {        mObservable.setChanged();    }    @Override    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {        if (isChecked) {            hide();        } else {            show();        }    }    //被观察者(Observable)   观察者(Observer)    private class ObservableInner extends Observable {       //自定义setChange方法,实现调系统方法        public void setChanged() {            super.setChanged();        }    }}

第三步:观察者

/** * 实现观察者模式的观察者 * 让text实现成为观察者 *Observer接收到通知的顺序是越晚加入列表的越先通知。 */public class TextViewObserver extends TextView implements Observer{    private static final String DEFAULT_HIDER = "******";    private String mOrignalContent = "";    //设置隐藏的内容    private String mHiderContent = DEFAULT_HIDER;    //是否隐藏    private boolean mIsHideContent = false;    private OnShownListener mOnShownListener;    private OnHiderListener mOnHiderListener;    public TextViewObserver(Context context) {        super(context);        mOrignalContent =  getText().toString();    }    public TextViewObserver(Context context, AttributeSet attrs) {        super(context, attrs);        mOrignalContent =  getText().toString();    }    public TextViewObserver(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        mOrignalContent =  getText().toString();    }    //接收到被观察者的信号后,开始执行具体操作    @Override    public void update(Observable o, Object arg) {        mIsHideContent = (boolean)arg;        if (mIsHideContent) {            setText(mHiderContent);            if (mOnHiderListener != null) {                //回调方法,用于铜币状态控制                mOnHiderListener.onHider();            }        } else {            setText(mOrignalContent);            if (mOnShownListener != null) {                mOnShownListener.onShown();            }        }    }    /**     * 注意:需要调用此方法才能实现隐藏效果,若直接调用setText()方法,则实现不了     * @param text     */    public void setTextExtension(String text) {        mOrignalContent = String.valueOf(text);        if (!mIsHideContent) {  // 非隐藏状态下,更新内容            setText(mOrignalContent);        }    }    /**     * 注意:需要调用此方法才能实现隐藏效果,若直接调用setText()方法,则实现不了     * @param text     */    public void setTextExtension(CharSequence text) {        mOrignalContent = String.valueOf(text);        if (!mIsHideContent) {  // 非隐藏状态下,更新内容            setText(mOrignalContent);        }    }    public void setHiderContent(String mHiderContent) {        this.mHiderContent = mHiderContent;    }    public String getHiderContent() {        return this.mHiderContent;    }    public void setOnShownListener(OnShownListener onShownListener) {        this.mOnShownListener = onShownListener;    }    public void setOnHiderListener(OnHiderListener onHiderListener) {        this.mOnHiderListener = onHiderListener;    }    public interface OnShownListener {        public void onShown();    }    public interface OnHiderListener {        public void onHider();    }}

第四步:主体部分实现

CheckBoxObservable checkBoxObservable;    TextViewObserver myAssertTotalAccount;    TextViewObserver regularInvestmentAccount;    TextViewObserver tongbaoAccount;    LinearLayout myAssertTotalAccountLayout;    ImageView totalAccountHider;//添加观察者        checkBoxObservable.addObserver(myAssertTotalAccount);        //观察者设置隐藏监听        myAssertTotalAccount.setOnHiderListener(new TextViewObserver.OnHiderListener() {            @Override            public void onHider() {                //此时不能设置为Gone,会引起布局的变化                myAssertTotalAccountLayout.setVisibility(View.INVISIBLE);                //设置铜宝图片状态                totalAccountHider.setVisibility(View.VISIBLE);            }        });        //观察者设置显示监听        myAssertTotalAccount.setOnShownListener(new TextViewObserver.OnShownListener() {            @Override            public void onShown() {                myAssertTotalAccountLayout.setVisibility(View.VISIBLE);                //此时不能设置为Gone,会引起布局的变化                totalAccountHider.setVisibility(View.INVISIBLE);            }        });        //添加其他观察者        checkBoxObservable.addObserver(regularInvestmentAccount);        checkBoxObservable.addObserver(tongbaoAccount);        checkBoxObservable.addObserver(myBalanceAccount);

最后别忘了:解除被观察者和观察者之间的绑定

@Override    public void onDestroyView() {        super.onDestroyView();        //解绑        ButterKnife.unbind(this);        if (checkBoxObservable != null) {            //解除观察者            checkBoxObservable.deleteObservers();        }    }

附带:CheckBox的button点击选择

<selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@drawable/wealth_eye_close" android:state_checked="true"/>    <item android:drawable="@drawable/wealth_eye_open" android:state_checked="false"/></selector>

以上,就可以实现