您的位置:首页 > 其它

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

2017-06-07 17:36 369 查看
老规矩上图:



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

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


以上,就可以实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息