2021SC@SDUSC
前言
前言
本篇开始分析飞花令项目的源码。飞花令的项目要求实现两个主要功能,一个是查询所有包含输入关键字的诗句,一个是人机模拟飞花令游戏。
本篇将继续分析分析查询功能的代码。
一、项目环境
android studio 4.1.2
Compile SDK version:30
Build Tools Version 30.0.3
gradle 6.8.3
二、代码分析
1.MainActivity.java文件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState
//@Nullable 表示定义的字段可以为空) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
onCreate方法主要是初次启动(指使用这个类)首先加载的方法。
重写onCreate方法时要记得调用super.onCreate(savedInstanceState),作用是加载一些组件,调用其父类Activity的onCreate方法来实现对界面的图画绘制工作。
setContentView(R.layout.activity_main);
利用setContentView方法定位到activity_main这个布局文件,MainActivity.java和activity_main.xml有了联系,
方法名setContentView的意思看的出来,启动内容视图“用”布局文件activity_main.xml。
2.页面跳转
如果点击飞花令,那么会进行页面跳转,而在这里页面跳转利用的是intent类来执行。
如果Intent对象中包含了目标的class文件,那么就是显示意图的跳转;如果Intent没有包含目标的class文件,就是隐式意图跳转,隐式意图跳转就涉及到比较多的Intent对象的属性值的比较。
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EditText key= findViewById(R.id.id_key);
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
System.out.println(key.getText().toString());
Bundle bundle = new Bundle();
bundle.putString("data",key.getText().toString());
intent.putExtras(bundle);
startActivity(intent);
}
});
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值,两个activity之间的通讯可以通过bundle类来实现。
intent.putExtras()可以用来传递参数
方法1:
设置方法 intent.putExtra(“aaa”, “bbbb”);
获取方法 this.getIntent().getCharSequenceExtra(“aaa”)
方法2:
设置方法:
Bundle bd = new Bundle();
bd.putString(“aaa”,“bbbb”);
intent.putExtras(bd);
获取方法
Bundle bd=this.getIntent().getExtras();
bd.getString(“aaa”));
这一部分的代码即是如果再MainActivity所对应的页面点击飞花令的按钮,即button1,会发生页面跳转,跳转到飞花令的页面,同时会传递关键字参数,方便进行飞花令游戏。
3.查询返回
public void onClick_go(View view){
//这里文件夹的名称必须是raw,否则无法找到,这里是读入文件的语句;
//数据集在raw里
InputStream input = getResources().openRawResource(R.raw.sumtry);
//对文件内容进行读取
try{
//把文件内容传给scanner
Scanner scanner=new Scanner(input);
int sum=1;
String line,ans = "";
String title="";
out:
while (scanner.hasNext()){
//一次读取一行
line=scanner.nextLine();
for (int i = 0; i < line.length(); i++)
{
if(line.charAt(i)==':') {//表示这里面含有作者和诗名
title = line; //title存储作者和诗名
continue out;
}
}
if(line.contains(key.getText().toString())){//含有带关键词的并且不是作者名和诗名
ans =line +"\n-------"+title.replaceAll("\\d+","")+ "\n";//诗句+作者名:诗名,title中正好存的是这首诗的作者名和诗名
//运用了正则表达式,是把数字字符都去掉
sum++;
poems.add(ans);
}
}
if(poems.isEmpty()) poems.add("空");
// 然后是个⼩判断,如果poems为空,也就意味着没有符合条件的
//诗句当poems不为空时,展示查询结果
MyAdapter myAdapter=new MyAdapter(MainActivity.this,R.layout.words_item,poems);
res.setAdapter(myAdapter);
scanner.close();
}catch (Exception e){
e.printStackTrace();
}
这部分我的理解就是,根据关键字,将原本就有的诗句库从头到尾扫一遍,扫到诗句包含有关键字的诗句,该诗句+作者名+诗名一起存储在String类型中,添加到Arraylist容器poems里,将poems作为数据源,加上上下文环境,页面布局,使用适配器,串联起来,并且将适配器与ListView通过setAdapter联系起来。
res.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//显示
String str=poems.get(position);
Toast.makeText(MainActivity.this,str,Toast.LENGTH_LONG).show();;
}
});
Toast是为了提醒用户,而又不影响用户的操作的提示栏。当你点击listview中某一句诗的时候,就会出现一个这样的提示框
总结
上下两篇研究完了查询功能是如何完成的,主要是应用了adapter+listview,除此之外也明白了完成一个app页面需要布局文件+activity文件,往往利用adapter的初始化来规定listview中的展示样式。