public class Calculator extends Activity {

这行代码定义计算器类 Calculator是继承 Activity类。这是计算器主要管理类,从前面的XML资源里,就知道Calculator类是第一个运行的类,是运行代码的入口点。

下面开始创建和定义使用的变量和常量。

EventListener mListener = new EventListener();

private CalculatorDisplay mDisplay;

private Persist mPersist;

private History mHistory;

private Logic mLogic;

private PanelSwitcher mPanelSwitcher;

private static final int CMD_CLEAR_HISTORY = 1;

private static final int CMD_BASIC_PANEL = 2;

private static final int CMD_ADVANCED_PANEL = 3;

private static final int HVGA_HEIGHT_PIXELS = 480;

private static final int HVGA_WIDTH_PIXELS = 320;

static final int BASIC_PANEL = 0;

static final int ADVANCED_PANEL = 1;

private static final String LOG_TAG = "Calculator";

private static final boolean DEBUG = false;

private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;

下面重载Activity类里的onCreate事件方法:

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

调用父类的方法运行。

setContentView(R.layout.main);

调用方法setContentViewR.layout.main的配置进行窗口布局,也就是设置了窗口的显示方式。

mPersist = new Persist(this);

创建数据保存和加载对象, Persist类是本应用程序里用来保存和加载计算器输入的字符串,比如当计算器程序要暂停时,就需要把用户输入表达式字符串保存到存储里,以便恢复运行后再加载出来。

mHistory = mPersist.history;

获取保存用户已经输入的字符串对象。

mDisplay = (CalculatorDisplay) findViewById(R.id.display);

这里通资源ID找到CalculatorDisplay显示资源和窗口。 CalculatorDisplay窗口主要用来显示计算器计算参数和结果,以及用户输入的内容。

mLogic = new Logic(this, mHistory, mDisplay, (Button) findViewById(R.id.equal));

这里是创建逻辑处理对象,对于本应用程序就是计算器的逻辑处理,比如输入字符的响应,以及计算表达式的值。

HistoryAdapter historyAdapter = new HistoryAdapter(this, mHistory, mLogic);

创建查看历史的窗口。

mHistory.setObserver(historyAdapter);

设置历史查看的窗口。

View view;

mPanelSwitcher = (PanelSwitcher) findViewById(R.id.panelswitch);

创建计算器输入数字的面板,它是继承android.view.GestureDetector类,因此可以处理所有触摸事件。

mListener.setHandler(mLogic, mPanelSwitcher);

让输入面板与逻辑处理模块通过事件关联在一起。

mDisplay.setOnKeyListener(mListener);

显示窗口通过事件监听器获取事件显示。

if ((view = findViewById(R.id.del)) != null) {

// view.setOnClickListener(mListener);

view.setOnLongClickListener(mListener);

}

/*

if ((view = findViewById(R.id.clear)) != null) {

view.setOnClickListener(mListener);

}

*/

}

下面创建选项菜单。

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

MenuItem item;

item = menu.add(0, CMD_CLEAR_HISTORY, 0, R.string.clear_history);

item.setIcon(R.drawable.clear_history);

item = menu.add(0, CMD_ADVANCED_PANEL, 0, R.string.advanced);

item.setIcon(R.drawable.advanced);

item = menu.add(0, CMD_BASIC_PANEL, 0, R.string.basic);

item.setIcon(R.drawable.simple);

return true;

}

准备选项菜单。

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

super.onPrepareOptionsMenu(menu);

menu.findItem(CMD_BASIC_PANEL).setVisible(mPanelSwitcher != null &&

mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL);

menu.findItem(CMD_ADVANCED_PANEL).setVisible(mPanelSwitcher != null &&

mPanelSwitcher.getCurrentIndex() == BASIC_PANEL);

return true;

}

当选中菜单时响应。

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case CMD_CLEAR_HISTORY:

mHistory.clear();

break;

case CMD_BASIC_PANEL:

if (mPanelSwitcher != null &&

mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {

mPanelSwitcher.moveRight();

}

break;

case CMD_ADVANCED_PANEL:

if (mPanelSwitcher != null &&

mPanelSwitcher.getCurrentIndex() == BASIC_PANEL) {

mPanelSwitcher.moveLeft();

}

break;

}

return super.onOptionsItemSelected(item);

}

保存实例状态。

@Override

protected void onSaveInstanceState(Bundle icicle) {

// as work-around for ClassCastException in TextView on restart

// avoid calling superclass, to keep icicle empty

}

暂停状态响应。

@Override

public void onPause() {

super.onPause();

mLogic.updateHistory();

mPersist.save();

}

按键按下响应。

@Override

public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {

if (keyCode == KeyEvent.KEYCODE_BACK

&& mPanelSwitcher.getCurrentIndex() == ADVANCED_PANEL) {

mPanelSwitcher.moveRight();

return true;

} else {

return super.onKeyDown(keyCode, keyEvent);

}

}

输出LOG调试信息。

static void log(String message) {

if (LOG_ENABLED) {

Log.v(LOG_TAG, message);

}

}

/**

* The font sizes in the layout files are specified for a HVGA display.

* Adjust the font sizes accordingly if we are running on a different

* display.

*/

调整字体的大小。

public void adjustFontSize(TextView view) {

float fontPixelSize = view.getTextSize();

Display display = getWindowManager().getDefaultDisplay();

int h = Math.min(display.getWidth(), display.getHeight());

float ratio = (float)h/HVGA_WIDTH_PIXELS;

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontPixelSize*ratio);

}

}

//QQ: 9073204 EMAIL:9073204@qq.com

//蔡军生  2011-05-29

更多相关文章

  1. Android(安卓)EditText常用属性
  2. Android中EditText控件的几种使用方法
  3. android jni开发,用javah生成***.h头文件,用ndk在libs下生成***.so
  4. Android---Android让文本输入框默认不获取焦点
  5. Android(安卓)输入事件流程
  6. 自定义带提示的文本输入框
  7. android 【点击输入框调出输入法前的】输入框获取焦点和输入法的
  8. Android_显示某个Activity时立即弹出软键盘
  9. Android(安卓)WebView加载带有Input的输入框时点击无法弹出软键

随机推荐

  1. 在Eclipse下编译Android原生APK方法
  2. H5与android原生的JS交互
  3. Android优化——UI检视利器:Hierarchy Vie
  4. Android基于开源项目的WheelView的时间、
  5. 让android的webview中的按钮,触发事件,也能
  6. Android(安卓)中级学习心得
  7. Android菜鸟日记25-android反编译
  8. Android开发艺术探索 - 第11章 Android的
  9. android WebView的使用详解
  10. Android学习群群内分享:Android面试中的那