安卓开发之星座查询

星座查询

目标:

创建一个 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: