写一个小程序把安卓程序中的几个基础组件的基本用法串联起来。
如下图所示:
在安卓程序中,一个计时器,一直在不断地计时,每10秒弹出一个提示。
MainActivity被一个标签页分成两部分,一部分,有单选按钮与复选按钮,最后有一个提交按钮,
结果在另一个标签页中显示。
用这个程序来说明安卓中标签页、计时器、单选按钮、复选按钮的用法。
首先贴上res\values\string.xml中,各个组件的字符串。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">标签页与基本组件</string>
<string name="action_settings">Settings</string>
<string name="tab1_RadioGroup1_RadioButton1">单选选项1</string>
<string name="tab1_RadioGroup1_RadioButton2">单选选项2</string>
<string name="tab1_CheckBox1">复选选项1</string>
<string name="tab1_CheckBox2">复选选项2</string>
<string name="tab1_Button1">提交</string>
<string name="tab2_TextView1">标签页2</string>
</resources>
整个程序的组件,已经基本可以略窥一二了,
标签页的的标题“组件”、“结果”一会儿通过Java中设置。
同时,在没有按“组件”标签页的“提交”按钮之前,在“结果”标签页的标签文本TextView默认是为“标签2”。
1、首先在res\layout文件夹中新建两个xml,一个为tab1.xml,一个为tab2.xml如下图所示:
如果你在一个Activity中决定使用标签页,那你这个Activity中基本布局文件,这里MainActivity默认是activity_main.xml是定死了,必须这样写:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
</TabHost>
这里大家可以明显注意到,这里设置ID的方式,与平时我们自己定义安卓组件的情况不同,这里设置Id不为android:id="@+id/xx"中间没有加号。这是因为这个标签页组件是系统中一个固定的常量,tabhost、tabs这些id,不得自己改名,相当于关键字。
2、之后是对"组件"标签页的布局tab1.xml的书写。
这里很简单,通过一个基本线性布局,各个组件垂直排列下来,在"组件"标签页中放着一个计时器、单选按钮组、复选按钮x2,一个按钮,并且对要被Java控制的组件赋予id。
同时非常重要的一点是,要为总的线性布局赋予id,一会儿要在MainActivity.java声明,标签1加载这个布局。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- 计时器 -->
<Chronometer
android:id="@+id/chronometer1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp" />
<!--
单选按钮组
需要注意的是:
单选按钮组如果要被控制
必须对单选按钮组、各个单选按钮都赋予相应的id,
否则程序会出错
-->
<RadioGroup
android:id="@+id/tab1_RadioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/tab1_RadioGroup1_RadioButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/tab1_RadioGroup1_RadioButton1"
android:textSize="24sp" />
<RadioButton
android:id="@+id/tab1_RadioGroup1_RadioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tab1_RadioGroup1_RadioButton2"
android:textSize="24sp" />
</RadioGroup>
<!-- 复选框x2 -->
<CheckBox
android:id="@+id/tab1_CheckBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tab1_CheckBox1"
android:textSize="24sp" />
<CheckBox
android:id="@+id/tab1_CheckBox2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tab1_CheckBox2"
android:textSize="24sp" />
<!-- 按钮 -->
<Button
android:id="@+id/tab1_Button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tab1_Button1"
android:textSize="24sp" />
</LinearLayout>
3、最后是对"结果"标签页的布局tab2.xml的书写。这里非常简单,放置一个带id的标签文本TextView就OK了。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tab2_TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tab2_TextView1"
android:textSize="24sp" />
</LinearLayout>
4、布局完毕,开始对MainActivity.java这个文件进行书写。虽然用了标签页布局,但这个java文件能够一次性地控制多个标签页中的各个组件。
程序中的OnCreate方法分为三个部分,一个是标签页的初始化、一个是计时器的初始化、一个是按钮单击事件。没有什么特别的。
package com.tabComponent;
import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Chronometer;
import android.widget.Chronometer.OnChronometerTickListener;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
// 声明要控制的组件
private TabHost tabHost;
private Chronometer chronometer;
private RadioGroup tab1_RadioGroup1;
private CheckBox tab1_CheckBox1;
private CheckBox tab1_CheckBox2;
private Button tab1_Button1;
private TextView tab2_TextView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 标签页初始化开始
tabHost = (TabHost) findViewById(android.R.id.tabhost);
tabHost.setup();
LayoutInflater layoutInflater = LayoutInflater.from(this);
layoutInflater.inflate(R.layout.tab1, tabHost.getTabContentView());
layoutInflater.inflate(R.layout.tab2, tabHost.getTabContentView());
tabHost.addTab(tabHost.newTabSpec("").setIndicator("组件")
.setContent(R.id.LinearLayout1));// 设置标签1的标题为“组件”,且布局为LinearLayout1,下同理
tabHost.addTab(tabHost.newTabSpec("").setIndicator("结果")
.setContent(R.id.LinearLayout2));
// 标签页初始化结束
// 计时器初始化开始
chronometer = (Chronometer) findViewById(R.id.chronometer1);
chronometer.setFormat("程序已经运行了:%s");// %s就是那个不断跳跃的时间,其格式为00:00,精确到秒
chronometer.start();// 开始计时,默认不开始
chronometer// 计时器监听事件,计时器每改变一次触发一次,这里是每1秒触发一次
.setOnChronometerTickListener(new OnChronometerTickListener() {
int i = 0;
// 这个i,自从程序运行之后,每秒都在自增
public void onChronometerTick(Chronometer chronometer) {
i++;
if (i % 10 == 0) {// 每10秒,弹出一个Toast提示一下
Toast.makeText(MainActivity.this,
"程序已启动了" + i + "秒", Toast.LENGTH_LONG)
.show();
}
}
});
// 计时器结束
// 按钮1点击事件开始
tab1_Button1 = (Button) findViewById(R.id.tab1_Button1);
tab1_Button1.setOnClickListener(new OnClickListener() {// 为button1添加点击事件
@Override
public void onClick(View v) {
String str = "";
// 获取单选按钮组的值
tab1_RadioGroup1 = (RadioGroup) findViewById(R.id.tab1_RadioGroup1);
for (int i = 0; i < tab1_RadioGroup1.getChildCount(); i++) {
RadioButton radioButton = (RadioButton) tab1_RadioGroup1
.getChildAt(i);
if (radioButton.isChecked()) {
str += radioButton.getText() + "被选中,";
break;
}
}
// 获取各个复选框是否被选中
tab1_CheckBox1 = (CheckBox) findViewById(R.id.tab1_CheckBox1);
if (tab1_CheckBox1.isChecked()) {
str += tab1_CheckBox1.getText() + "被选中,";
}
tab1_CheckBox2 = (CheckBox) findViewById(R.id.tab1_CheckBox2);
if (tab1_CheckBox2.isChecked()) {
str += tab1_CheckBox2.getText() + "被选中,";
}
tab2_TextView1 = (TextView) findViewById(R.id.tab2_TextView1);
tab2_TextView1.setText(str);
}
});
// 按钮1点击事件结束
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
至此,整个安卓程序写完。