android觀察者模式三種實現方法

本文介绍如何使用观察者模式实现一个简单的身高体重计算应用,包括内部类实现、匿名类实现和直接实现三种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

demo: EditText計算身高體重,使用觀察者模式實現

1.內部類實現

package com.zhg.day0102;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;

public class Day01_02Activity extends Activity {
	private TextView tvHeight, tvWeight;
	private EditText etHeight, etWeight;
	private Button btnCalc, btnCancle;
	private LinearLayout root, row1, row2, row3;

	/**內部類重寫OnClickListener方法
	 * 创建一个监听器类,实现OnClickListener接口
	 * 
	 * @author Administrator
	 * 
	 */
	private class ButtonClickListener implements OnClickListener {
		/**
		 * 单击事件的处理方法
		 * 
		 */
		public void onClick(View v) {
			// TODO Auto-generated method stub
		   String text = ((Button) v).getText().toString();
			
			if ("计算".equals(text)) {
				double height = 0;
				double weight = 0;
				//获取身高
				if(etHeight.getText()!=null && !"".equals(etHeight.getText().toString().trim())){
					height = Double.parseDouble(etHeight.getText().toString());
				}
				
				//获取体重
				if(etWeight.getText()!=null && !"".equals(etWeight.getText().toString().trim())){
					weight = Double.parseDouble(etWeight.getText().toString());
				}
				
				Log.i("info", "height=" + height);
				Log.i("info", "weight=" + weight);
				
				//计算bmi值
				double bmi = weight/(height*height/10000);
				Log.i("info", "bmi=" + bmi);
				//根据bmi值 输入身材提示
				if(bmi<18){
					Toast.makeText(Day01_02Activity.this, "偏瘦", 3000).show();
				}else if(bmi<=25){
					Toast.makeText(Day01_02Activity.this, "标准", 3000).show();
				}else if(bmi<=30){
					Toast.makeText(Day01_02Activity.this, "偏胖", 3000).show();
				}
			}else{//单击btnCancel
				//清空文本框
				etHeight.setText("");
				etWeight.setText("");
			}
		}

	}

	private void setupView() {
		tvHeight = new TextView(this);
		tvHeight.setText("身高");

		etHeight = new EditText(this);
		LayoutParams p1 = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT, 1.0f);
		// etHeight.setLayoutParams(p1);

		row1 = new LinearLayout(this);
		row1.addView(tvHeight);
		row1.addView(etHeight, p1);

		tvWeight = new TextView(this);
		tvWeight.setText("体重");

		etWeight = new EditText(this);
		etWeight.setLayoutParams(p1);

		row2 = new LinearLayout(this);
		row2.addView(tvWeight);
		row2.addView(etWeight);

		btnCalc = new Button(this);
		btnCalc.setText("计算");

		btnCancle = new Button(this);
		btnCancle.setText("取消");

		row3 = new LinearLayout(this);
		row3.addView(btnCalc, p1);
		row3.addView(btnCancle, p1);

		root = new LinearLayout(this);
		root.setOrientation(LinearLayout.VERTICAL);
		root.addView(row1);
		root.addView(row2);
		root.addView(row3);

		setContentView(root);
	}

	private void addListener() {
		// 创建监听器对象
		ButtonClickListener listener = new ButtonClickListener();
		// 注册监听对象到要监听的事件源
		btnCalc.setOnClickListener(listener);
		btnCancle.setOnClickListener(listener);
	}

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.main);
		setupView();
		addListener();
	}
}



2.匿名類實現


package com.tarena.day0104;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;

public class Day01_04Activity extends Activity {
	private TextView tvHeight, tvWeight;
	private EditText etHeight, etWeight;
	private Button btnCalc, btnCancle;
	private LinearLayout root, row1, row2, row3;

	
//創建介面
	private void setupView() {
		tvHeight = new TextView(this);
		tvHeight.setText("身高");

		etHeight = new EditText(this);
		LayoutParams p1 = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT, 1.0f);
		// etHeight.setLayoutParams(p1);

		row1 = new LinearLayout(this);
		row1.addView(tvHeight);
		row1.addView(etHeight, p1);

		tvWeight = new TextView(this);
		tvWeight.setText("体重");

		etWeight = new EditText(this);
		etWeight.setLayoutParams(p1);

		row2 = new LinearLayout(this);
		row2.addView(tvWeight);
		row2.addView(etWeight);

		btnCalc = new Button(this);
		btnCalc.setText("计算");

		btnCancle = new Button(this);
		btnCancle.setText("取消");

		row3 = new LinearLayout(this);
		row3.addView(btnCalc, p1);
		row3.addView(btnCancle, p1);

		root = new LinearLayout(this);
		root.setOrientation(LinearLayout.VERTICAL);
		root.addView(row1);
		root.addView(row2);
		root.addView(row3);

		setContentView(root);
	}
//創建監聽方法
	private void addListener() {
		
		// 注册监听对象到要监听的事件源,匿名類實現,只調用一次
		btnCalc.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(Day01_04Activity.this, "btnCalc被单击", 3000).show();
				
			}
		});
		
		btnCancle.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(Day01_04Activity.this, "btnCancel被单击", 3000).show();
			}
		});
	}

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//調用創建介面方法
		setupView();
		//調用監聽方法
		addListener();
	}
}



3.直接實現

package com.zhg.day0103;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;

public class Day01_03Activity extends Activity implements OnClickListener{
	private TextView tvHeight, tvWeight;
	private EditText etHeight, etWeight;
	private Button btnCalc, btnCancle;
	private LinearLayout root, row1, row2, row3;

	

	public void onClick(View v) {
		//取得文本框的值
		String text = ((Button) v).getText().toString();
		//觸發點擊事件
		if ("计算".equals(text)) {
			Toast.makeText(Day01_03Activity.this, "btnCalc按钮被单击", 3000)
					.show();
		}else{
			Toast.makeText(Day01_03Activity.this, "btnCancel按钮被单击", 3000)
			.show();
		}
	}

	private void setupView() {
		tvHeight = new TextView(this);
		tvHeight.setText("身高");

		etHeight = new EditText(this);
		LayoutParams p1 = new LayoutParams(LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT, 1.0f);
		// etHeight.setLayoutParams(p1);

		row1 = new LinearLayout(this);
		row1.addView(tvHeight);
		row1.addView(etHeight, p1);

		tvWeight = new TextView(this);
		tvWeight.setText("体重");

		etWeight = new EditText(this);
		etWeight.setLayoutParams(p1);

		row2 = new LinearLayout(this);
		row2.addView(tvWeight);
		row2.addView(etWeight);

		btnCalc = new Button(this);
		btnCalc.setText("计算");

		btnCancle = new Button(this);
		btnCancle.setText("取消");

		row3 = new LinearLayout(this);
		row3.addView(btnCalc, p1);
		row3.addView(btnCancle, p1);

		root = new LinearLayout(this);
		root.setOrientation(LinearLayout.VERTICAL);
		root.addView(row1);
		root.addView(row2);
		root.addView(row3);

		setContentView(root);
	}

	private void addListener() {
		
		// 注册监听对象到要监听的事件源
		btnCalc.setOnClickListener(this);
		btnCancle.setOnClickListener(this);
	}

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.main);
		setupView();
		addListener();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值