老规矩上图:
第一步:上布局视图只贴一部分
<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>
以上,就可以实现