根据《深入浅出Android》中的例子,简单熟悉Android的开发,对原书中的实例加以简单扩展。
apk文件下载。
该程序是用于计算体重指数(BMI)的,"体重指数"是用来衡量人体体重是否正常(正常还是或胖或瘦)的一种计算方法,这种方法将人的体重和身高作为主要的计算依据。
程序主要涉及到Activity,Toast,Menu,Button,AlertDialog,TextView,EditView,RadioButton,RadioGroup等简单控件及SharedPreferences的使用的相关知识。
程序主界面截图如下:
主界面layout文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fadeScrollbars="true"
android:orientation="vertical"
android:scrollbars="vertical" >
<RadioGroup
android:id="@+id/rgSex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/rbMale"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/male" />
<RadioButton
android:id="@+id/rbFemale"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:text="@string/female" />
</RadioGroup>
<TextView
android:id="@+id/tvHeight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/height" />
<EditText
android:id="@+id/etHeight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal" />
<TextView
android:id="@+id/tvWeigth"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/weight" />
<EditText
android:id="@+id/EtWeight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="@dimen/marginTop" >
<Button
android:id="@+id/btnCompute"
android:layout_width="wrap_content"
android:layout_height="@dimen/buttonHeight"
android:text="@string/btncompute" />
<Button
android:id="@+id/btnMore"
android:layout_width="wrap_content"
android:layout_height="@dimen/buttonHeight"
android:layout_toRightOf="@id/btnCompute"
android:text="@string/btnMore" />
<Button
android:id="@+id/btnAboutauthor"
android:layout_width="wrap_content"
android:layout_height="@dimen/buttonHeight"
android:layout_toRightOf="@id/btnMore"
android:text="@string/btnAboutauthor" />
<Button
android:id="@+id/btnExit"
android:layout_width="wrap_content"
android:layout_height="@dimen/buttonHeight"
android:layout_toRightOf="@id/btnAboutauthor"
android:text="@string/btnExit" />
</RelativeLayout>
<TextView
android:id="@+id/tvNotice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/marginTop"
android:text="@string/notice"
android:textColor="#FF0000"
android:textStyle="bold"/>
</LinearLayout>
在layout中定义好的控件通过findViewById方法查找到,再设置好相应的setOnClickListener处理点击操作即可。
点击“说明”,通过startActivity方法弹出说明界面,如下图所示:
layout文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadeScrollbars="true"
android:orientation="vertical"
android:scrollbars="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:background="#535252" >
<TextView
android:id="@+id/tvAboutTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginRight="40dp"
android:text="@string/aboutTitle"
android:textColor="#C2D560" />
<Button
android:id="@+id/btnReturn"
android:layout_width="wrap_content"
android:layout_height="@dimen/buttonHeight"
android:layout_alignParentRight="true"
android:text="@string/btnReturn"
android:textColor="#C2D560"
android:background="#535252"/>
</RelativeLayout>
<TextView
android:id="@+id/tvAbout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/marginTop"
android:text="@string/about" />
<TextView
android:id="@+id/tvFormula"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/marginTop"
android:text="@string/formula" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/marginTop"
android:text="@string/standNotice"
android:textColor="#00FFFF" />
<TextView
android:id="@+id/tvLight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/marginTop"
android:text="@string/light" />
<TextView
android:id="@+id/tvExample"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/marginTop"
android:text="@string/example" />
</LinearLayout>
点击“关于”时,用AlertDialog弹出关于信息,当然也可以用Toast提示信息,代码如下:
private void AboutAuthor() {
new AlertDialog.Builder(BMIActivity.this)
.setCancelable(true)
.setTitle(R.string.contactTitle)
.setMessage(R.string.contact)
.setPositiveButton(R.string.btnSure,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
arg0.cancel();
}
}).show();
// Toast.makeText(this, R.string.contact, Toast.LENGTH_SHORT).show();
}
点击“退出”时,用AlertDialog弹出确认操作信息,代码如下:
private void CloseMethod() {
new AlertDialog.Builder(BMIActivity.this)
.setTitle(R.string.exitNotice)
.setCancelable(false)
.setMessage(R.string.exitAsk)
.setNegativeButton(R.string.btnReturn,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
arg0.cancel();
}
})
.setPositiveButton(R.string.btnSure,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
finish();
}
}).show();
}
通过重载onCreateOptionsMenu方法添加菜单,代码如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu);
menu.add(0, menuAbout, 0, "关于……");
menu.add(0, menuExit, 0, "退出……");
return true;
}
通过重载onOptionsItemSelected响应菜单操作,代码如下:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case menuAbout:
AboutAuthor();
break;
case menuExit:
CloseMethod();
break;
default:
break;
}
return true;
}
因为自己的身高一般不常改变,要想在程序关闭后再次打开时,不需要再重复输入身高信息,那么就需要将身高信息保存起来。Android中可以用SharedPreferences来方便保存数据。SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
本程序中通过重载onStop方法在程序退出时来保存身高数据,代码如下:
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
SharedPreferences pre = getSharedPreferences(PREF, 0);
pre.edit().putString(PREF_HEIGHT, tvHeight.getText().toString())
.commit();
}
可以看到/data/data/<waterfrost.com.bmi>/shared_prefs目录下生成一个名为:BMIPREF.xml的文件,如下图所示:
BMIPREF.xml文件内容为:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="BMIHEIGHT">170</string>
</map>
程序再次打开时,读取身高数据并通过EditText的setText方法将身高设置到输入框中,代码如下:
private void ReadPreference() {
SharedPreferences pre = getSharedPreferences(PREF, 0);
String height = pre.getString(PREF_HEIGHT, "");
if (!"".equals(height)) {
tvHeight.setText(height);
tvWeight.requestFocus();
}
}
另外,程序的图标可以在AndroidManifest.xml中application节点的android:icon属性进行设置,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="waterfrost.com.bmi"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/bmi"
android:label="@string/app_name" >
<activity
android:name=".BMIActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AboutActivity" android:label="@string/aboutTitle" />
</application>
</manifest>
@drawable/bmi”为程序自定义的图标文件。