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

老规矩上图:

利用观察者(Observer)和被观察者(Observable)实现监听操作_第1张图片

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

 <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" />
            
            <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" />
            
        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">
                
                <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>

以上,就可以实现

你可能感兴趣的:(Android)