通过对Android的学习,这次demo实现一个星座的查询,想看自己是哪个的星座的,不妨可以来看看该文章
目标:
创建一个 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() {
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需要的
public Intent putExtra(String name, 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好像把它和谐了,只能放图片了。
结束:如果你看到这里或者正好对你有所帮助
有错误的地方,欢迎在评论指出,作者看到会进行修改。