安卓开发之星座查询
星座查询
目标:
创建一个 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需要的
@NonNullpublic 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好像把它和谐了,只能放图片了。如果想获取素材和代码可以评论留言。
结束:
如果你看到这里或者正好对你有所帮助,希望能点个????或者⭐感谢;
有错误的地方,欢迎在评论指出,作者看到会进行修改。
来源https://www.cnblogs.com/xbhog/p/15389599.html