安卓開發之星座查詢

星座查詢

目標:

創建一個 Android 項目,實現星座查詢功能,功能要求如下:

  1. 該應用由 2 個界面組成,分別為星座查詢主界面(如圖 1 所示)、查詢結果界面(如圖 4所示)。

  2. 在圖 1 界面中設置生日輸入框不能進行輸入,只能點擊彈出日期對話框進行選擇(如圖3 所示),並將選擇的日期顯示在生日框中(如圖 2 所示)。

  3. 在圖 1 界面中輸入姓名、選擇出生日期後,點擊「查詢星座」按鈕能夠跳轉到查詢結果界面(如圖 4 所示)。

  4. 若圖 1 界面中的生日為空,則點擊「查詢星座」按鈕時使用 Toast 給出提示信息「出生日期為空,請選擇您的生日!」

  5. 在圖 4 界面中,顯示在圖 1 界面中輸入的姓名和出生日期,並根據出生日期計算出所屬星座,在圖 4 界面中顯示出該星座對應的星座圖片和星座特點的描述(讀文件file1~file12),同時將圖 4 界面的標題設置為該星座的名稱。

image-20211010152429394

素材:

image-20211010143211587

實現:

通過上述的要求,我們可以確定的的思路:

通過設計要求,我們需要兩個頁面實現跳轉,第一個主頁面需要包含姓名和出生日期,通過點擊事件將該信息傳遞到第二個頁面,通過對出生日期的對比,找到符合的內容(圖片和文字描述)等。

OnePage:

首先我們先實現第一個頁面,

image-20211010143257528

拆分佈局,紅色邊框框住的都是TextView,基本沒什麼好說的,主要是下面生日輸入框,這裡我們採用的日曆選擇方式。

如圖所示:

image-20211010152336214

首先我們需要設置下生日輸入框的屬性:

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:

先看頁面:

image-20211010145014100

從標題、用戶名、出生日期和星座特點都是由第一頁傳遞的數據顯示的。

所以我們需要動態的處理數據。

先獲取信息,設置姓名 出生日期等信息:

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;
}

最後效果圖:

image-20211010152429394

原來想傳GIF的,但是Gitee好像把它和諧了,只能放圖片了。如果想獲取素材和代碼可以評論留言。

結束:

如果你看到這裡或者正好對你有所幫助,希望能點個👍或者⭐感謝;

有錯誤的地方,歡迎在評論指出,作者看到會進行修改。

Tags: