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

xiaoxiao2021-02-28  68

老规矩上图:

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

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

以上,就可以实现

转载请注明原文地址: https://www.6miu.com/read-54386.html

最新回复(0)