在安卓4.4的工程中,每次建立工程同樣會出現Helloworld,但不同于以前的版本,現在的Helloworld還自帶菜單。這篇文章配合安卓的常用元件日期拾取器、時間拾取器來講解安卓菜單怎麼修改。日期拾取器、時間拾取器兩個元件很大,一般情況下,建議使用《【Android】多個Activity之間利用bundle傳遞數值》(點選打開連結)中介紹的方式,為日期拾取器、時間拾取器新開一個Activity進行互動。
如下圖的一個app:
一進入app,在右下角裡面顯示目前的時間。
通過移動日期拾取器、時間拾取器,右下角的時間會跟着修改。
同時把建立App時,在右上角的自帶的菜單,修改成帶一個“退出”的子項,關閉這個app。
1、首先,對res\value\strings.xml中,所定義的字元串,修改成如下的代碼。主要是修改app的名稱,與菜單的子項。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">拾取器與菜單</string>
<string name="menu_exit">退出</string>
</resources>
2、之後是修改res\menu\main.xml,定義右上角菜單的子項,修改成如下的代碼,定義子項的id為menu_exit,同時其顯示的字型為string的menu_exit字元串,也就是“退出”二字。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_exit"
android:title="@string/menu_exit"/>
</menu>
3、其次是修改res\layout\activity_main.xml,對MainActivity.java進行布局,此處的布局思想如下,其中,線上性布局的元件皆居中,即設定android:layout_gravity="center_vertical"。
是以,就把res\layout\activity_main.xml修改如下,對要操作的元件賦予id:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<DatePicker
android:id="@+id/datePicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:calendarViewShown="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TimePicker
android:id="@+id/timePicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
其中,日期拾取器中設定:android:calendarViewShown="false"即設定不顯示其自帶的日期元件。
時間拾取器預設是12小時制的,這裡運作效果是24小時制的是在Mainactivity.java所設定。
日期拾取器、時間拾取器不推薦放在一行,這兩個元件沒有自帶的大小屬性調節其大小。如果要調節其大小,要在Java中寫成很的代碼,而且網上所流傳的資料,對與android api8是無效的,也就是android2.2。這裡不推薦這樣做。
4、最後,對Mainactivity.java編寫如下的代碼,這裡的代碼分為兩部分,一部分是Mainactivity.java内部的日期拾取器、時間拾取器,一部分是菜單的代碼。其中,取出目前系統的年月日時分秒,使用到Calendar執行個體,也就是《【Java】使用Calendar類來擷取目前的日期》(點選打開連結)中的方法。這裡不再贅述了。
package com.Picker;
import java.util.Calendar;
import java.util.GregorianCalendar;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
public class MainActivity extends Activity {
private DatePicker datePicker1;
private TimePicker timePicker1;
private TextView textView1;
private TextView textView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 取出目前的年月日時分
Calendar calendar = Calendar.getInstance();
int year = calendar.get(GregorianCalendar.YEAR);
int month = calendar.get(GregorianCalendar.MONTH) + 1;
int day = calendar.get(GregorianCalendar.DAY_OF_MONTH);
int hour = calendar.get(GregorianCalendar.HOUR);
int minutes = calendar.get(GregorianCalendar.MINUTE);
//擷取各個元件
textView1 = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);
datePicker1 = (DatePicker) findViewById(R.id.datePicker1);
timePicker1 = (TimePicker) findViewById(R.id.timePicker1);
//設定時間拾取器為24小時制
timePicker1.setIs24HourView(true);
//程式一開始先初始化兩個标簽文本,将其設定為目前時期。
textView1.setText(year + "年" + month + "月" + day + "日");
textView2.setText(hour + ":" + minutes);
//對日期拾取器設定監聽器,注意其設定方法與其他組建不同,需要通過其初始化方法來設定
datePicker1.init(year, month, day, new OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker arg0, int year, int month,
int day) {
//如果其被修改,則改變标簽文本1,其中這裡的月份同樣是需要+1才等于正常的月份
textView1.setText(year + "年" + (month+1) + "月" + day + "日");
}
});
//時間拾取器被修改的監聽器
timePicker1.setOnTimeChangedListener(new OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker arg0, int hour, int minutes) {
//一旦修改,則修改标簽文本2
textView2.setText(hour + ":" + minutes);
}
});
}
// 建立menu的方法,沒有該方法,不會在右上角設定菜單。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 設定menu界面為res\menu\menu.xml
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// 處理菜單事件
public boolean onOptionsItemSelected(MenuItem item) {
// 得到目前選中的MenuItem的ID,
int item_id = item.getItemId();
switch (item_id) {
//設定id為menu_exit的菜單子項所要執行的方法。
case R.id.menu_exit:
finish();//關閉MainActivity這個Activity。相當于結束程式,寫成System.exit(0)也可以。
break;
}
return true;
}
}