星座查詢
目標:
建立一個 Android 專案,實現星座查詢功能,功能要求如下:
-
該應用由 2 個介面組成,分別為星座查詢主介面(如圖 1 所示)、查詢結果介面(如圖 4所示)。
-
在圖 1 介面中設定生日輸入框不能進行輸入,只能點選彈出日期對話方塊進行選擇(如圖3 所示),並將選擇的日期顯示在生日框中(如圖 2 所示)。
-
在圖 1 介面中輸入姓名、選擇出生日期後,點選“查詢星座”按鈕能夠跳轉到查詢結果介面(如圖 4 所示)。
-
若圖 1 介面中的生日為空,則點選“查詢星座”按鈕時使用 Toast 給出提示資訊“出生日期為空,請選擇您的生日!”
-
在圖 4 介面中,顯示在圖 1 介面中輸入的姓名和出生日期,並根據出生日期計算出所屬星座,在圖 4 介面中顯示出該星座對應的星座圖片和星座特點的描述(讀檔案file1~file12),同時將圖 4 介面的標題設定為該星座的名稱。
素材:
實現:
通過上述的要求,我們可以確定的的思路:
通過設計要求,我們需要兩個頁面實現跳轉,第一個主頁面需要包含姓名和出生日期,通過點選事件將該資訊傳遞到第二個頁面,通過對出生日期的對比,找到符合的內容(圖片和文字描述)等。
OnePage:
首先我們先實現第一個頁面,
拆分佈局,紅色邊框框住的都是TextView,基本沒什麼好說的,主要是下面生日輸入框,這裡我們採用的日曆選擇方式。
如圖所示:
首先我們需要設定下生日輸入框的屬性:
android:focusable="false"
通過設定,取消輸入框的獲取焦點的功能,然後給他繫結一個點選事件:
android:onClick="showCalendar"
這時候進入主方法區(MainActivity),new一個DatePickerDialog,重寫裡面的onDateSet方法,實現日期選擇器:
//點選實現彈出一個日期選擇器
//定義一個日期選擇器
Calendar calendar = Calendar.getInstance();
DatePickerDialog dialog = new DatePickerDialog(MainActivity3.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
//使用者選定日期後,將選定的日期再Editext中顯示,
MainActivity3.this.date = year+"-"+(month+1)+"-"+day;
System.out.println(MainActivity3.this.date);
EditText et_birthdat = findViewById(R.id.eCalendar);
et_birthdat.setText(MainActivity3.this.date);
}
},calendar.get(Calendar.YEAR) , calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE));
dialog.show(); //顯示日期
這裡日期選擇的是Calendar類,Java原來的Date類,在JDK9已經被廢棄了。
根據我們剛開始的分析的,第二個頁面需要兩個資料,名字和生日,這裡我把這兩個屬性封裝成物件傳遞:
package com.example.homework3.user;
import java.io.Serializable;
//getter、setter、toString自己新增
public class User implements Serializable {
private String name;
private String birthday;
}
注意這裡的物件需要序列化,這是因為在傳遞的時候putExtra需要的
@NonNull
public Intent putExtra(String name, @Nullable Serializable value) {
throw new RuntimeException("Stub!");
}
屬性封裝好了以後在點選Button觸發點選事件,實現資料傳遞。
這裡做了一下處理:當日期的資料為空的話,則使用Toast實現提醒並不跳轉。
if(date == null){
Toast.makeText(MainActivity3.this,"出生日期為空,清選擇您的生日",Toast.LENGTH_SHORT).show();
return;
}
TwoPage:
先看頁面:
從標題、使用者名稱、出生日期和星座特點都是由第一頁傳遞的資料顯示的。
所以我們需要動態的處理資料。
先獲取資訊,設定姓名 出生日期等資訊:
Intent intent = getIntent();
User user = (User) intent.getSerializableExtra("user");
TextView Tname = findViewById(R.id.Tname);
TextView Tbirthday = findViewById(R.id.Tbirthday);
String name = user.getName();
String birthday = user.getBirthday();
//設定姓名和日期
Tname.append(" " + name);
Tbirthday.append(" " + birthday);
接下來對日期的處理來獲得相應的資料。
提取了names,days,imgs,fileNames多個陣列,星座名稱,對應開始日,星座圖片,星座檔案等;
以days[]來說,處理成以下格式:
int[] days = {0,20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22};
補零方便後續的下標計算方便;
處理日期和標題的設定:
//獲取月份和日期
int month = Integer.parseInt(strings[1]);
int day = Integer.parseInt(strings[2]);
int idx = -1;
//7 days[7] == 23, idx =
if(day < days[month]) idx = month-1;
else idx = month;
if(idx == 0) idx = days.length-1;
//設定標題
setTitle(names[idx]);
設定星座圖片:
//設定星座圖片
ImageView img = findViewById(R.id.imageView);
img.setImageResource(imgs[idx]);
TextView signText = findViewById(R.id.sign);
signText.setText("您的星座是:"+names[idx]+"特點如下:");
星座特點的處理在不同的檔案是不同的,這裡是Assets資料夾的處理。
//設定星座特點
try {
String text = readFromeAssets(fileNames[idx]);
TextView textview = findViewById(R.id.textShow);
textview.setText(text);
} catch (IOException e) {
e.printStackTrace();
}
對應方法:
//讀檔案
public String readFromeAssets(String sid) throws IOException {
InputStream open = getResources().getAssets().open(sid);
byte[] buffer = new byte[open.available()];
open.read(buffer);
String s = new String(buffer,"gbk");
open.close();
return s;
}
最後效果圖:
原來想傳GIF的,但是Gitee好像把它和諧了,只能放圖片了。如果想獲取素材和程式碼可以評論留言。
結束:
如果你看到這裡或者正好對你有所幫助,希望能點個?或者⭐感謝;
有錯誤的地方,歡迎在評論指出,作者看到會進行修改。