利用观察者(Observer)和被观察者(Observable)实现监听操作
2017-06-07 17:36
369 查看
老规矩上图:
第一步:上布局视图只贴一部分
第二步:被观察者
第三步:观察者
第四步:主体部分实现
最后别忘了:解除被观察者和观察者之间的绑定
附带:CheckBox的button点击选择
以上,就可以实现
第一步:上布局视图只贴一部分
<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>
以上,就可以实现
相关文章推荐
- 利用Observable、Observer实现观察者模式
- Android短信监听(二)——利用ContentObserver实现短信监听
- Java 语言使用 Observer/Observable 实现简单的观察者模式
- 使用观察者(Observer)实现对象监听
- Rx_java(2) 使用java中的类(Observable与Observer)实现观察者模式
- [置顶] Java Observer与Observable实现观察者模式
- 利用Java提供的Observer接口和Observable类实现观察者模式
- 观察者模式之----Observable和Observer是怎么实现奇妙的通知功能的
- 使用观察者(Observer)实现对象监听 (转自http://blog.csdn.net/kalex)
- 使用观察者模式Observer实现对Android网络状态的监听
- 利用接口实现自定义监听事件以及观察者模式
- Android使用观察者模式Observer实现网络状态监听
- Observer,Observable实现观察者模式
- Android短信监听(二)——利用ContentObserver实现短信监听
- Android短信监听(二)——利用ContentObserver实现短信监听
- Java 语言使用 Observer/Observable 实现简单的观察者模式
- 利用Observer(观察者)模式实现系统日志
- 基于Observer及Observable实现更易用的观察者模型
- java Web项目中,利用其过滤功能,实现访问者每次访问服务器时,记录访问者的IP,访问时间,Url等信息,并保存到文件的操作
- DataGrid-利用imagebutton实现更新操作