利用观察者(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>
以上,就可以实现
阅读全文
0 0
- 利用观察者(Observer)和被观察者(Observable)实现监听操作
- 利用Observable、Observer实现观察者模式
- java observer和observable 实现观察者模式
- 通过Observable类和Observer接口实现观察者设计模式
- Java_观察者模式(Observable和Observer)
- 观察者模式-java 内置 Observable 和 Observer
- Java_观察者模式(Observable和Observer)
- 浅谈 Observable和Observer 观察者模式
- Java_观察者模式(Observable和Observer)
- Java_观察者模式(Observable和Observer)
- Java_观察者模式(Observable和Observer)
- Android之观察者/被观察者模式Observer/Observable
- 观察者模式(Observer、Observable)
- Observable与Observer (观察者模式)
- Java观察者模式 : Observer / Observable
- java 观察者模式Observable Observer
- Java 语言使用 Observer/Observable 实现简单的观察者模式
- 观察者设计模式(Observable类Observer接口)的实现demo
- 排序算法(四)——归并排序与递归
- Android View源码解读:浅谈DecorView与ViewRootImpl
- 工程基础
- 广播
- 单例模式的几种写法
- 利用观察者(Observer)和被观察者(Observable)实现监听操作
- 服务端如何识别已登录用户身份之Session管理和Cookie应用
- $().each() 和$.each 的区别
- 排序算法(五)——快速排序
- Uva 11093 Just Finish it up——思路题
- iOS XML解析笔记
- presentViewController及属性传值
- oracle 修改表字段
- monkeyrunner脚本实践