制作单词记录App(二)
制作单词记录App(二)
- 制作单词记录App(二)
- 制作菜单
- 制作菜单和搜索功能的实现
- 制作清空数据功能和切换布局功能
本文为学习类文档,通过学习B站up主longway777的视频,再加上自己的总结与理解的学习类文章,如有侵权,请联系博主进行删除
制作单词记录App(二)
紧接着上次的继续做
完善查询功能和切换布局功能,制作清空功能
制作菜单
制作菜单和搜索功能的实现
res->new->resource file
type选择menu即可
- 制作menu界面
拖动两个Menu Item和一个Search Item至布局中,改写id和title
默认的搜索栏在menu下拉列表中,需要设置showAsAction属性使其在导航栏中显示,如下图所示
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/clearData"android:title="清空数据" /><itemandroid:id="@+id/switchViewType"android:title="切换视图" /><itemandroid:id="@+id/app_bar_search"android:icon="@drawable/ic_search_black_24dp"android:title="Search"app:actionViewClass="android.widget.SearchView"app:showAsAction="always" />
</menu>
- 在MainActivity中复写函数onCreateOptionsMenu()来添加刚创建的menu
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main_menu,menu);return super.onCreateOptionsMenu(menu);}
即可在所有界面添加该菜单,但不是我们想要的效果,因为在第二个添加界面我们不需要搜索框等工具,因此本次项目需要在对应的fragement中复写上述函数:
在WordFragement中复写函数:由于Fragement中默认不显示菜单,所以我们需要在构造方法中设置显示拥有菜单为真
public WordsFragment() {// Required empty public constructorsetHasOptionsMenu(true);}@Overridepublic void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {super.onCreateOptionsMenu(menu, inflater);inflater.inflate(R.menu.main_menu,menu);}
- 制作工具条的内容功能
设置搜索栏点击时,系统名不被隐藏的方法:
@Overridepublic void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {super.onCreateOptionsMenu(menu, inflater);inflater.inflate(R.menu.main_menu,menu);SearchView searchView = (SearchView) menu.findItem(R.id.app_bar_search).getActionView();//获取搜索栏的引用searchView.setMaxWidth(1000); //设置搜索栏宽度以防系统名被隐藏}
- 返回数据库底层制作查询功能:
(1)在WordDao中添加模糊查询功能代码:
@Query("SELECT * FROM WORD WHERE english_word LIKE :pattern ORDER BY ID DESC")LiveData<List<Word>> findWordsWithPattern(String pattern);
(2)在WordRepository中添加代码:
LiveData<List<Word>> findWordsWithPattern(String pattern) {return wordDao.findWordsWithPattern("%" + pattern + "%"); //通配符保证模糊匹配}
(3)在ViewModel中添加代码:
LiveData<List<Word>> findWordsWithPattern(String pattern) {return wordRepository.findWordsWithPattern(pattern);}
在WordFragement中添加过滤后的词汇变量:
制作fragement中的搜索栏的监听器:
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.Adapter;
import android.widget.SearchView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.util.List;/*** A simple {@link Fragment} subclass.*/
public class WordsFragment extends Fragment {private WordViewModel wordViewModel;private RecyclerView recyclerView;private MyAdapter myAdapter1,myAdapter2;private FloatingActionButton floatingActionButton;private LiveData<List<Word>> filteredWords; //过滤后的词汇public WordsFragment() {// Required empty public constructorsetHasOptionsMenu(true);}@Overridepublic void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {super.onCreateOptionsMenu(menu, inflater);inflater.inflate(R.menu.main_menu,menu);SearchView searchView = (SearchView) menu.findItem(R.id.app_bar_search).getActionView();//获取搜索栏的引用searchView.setMaxWidth(1000); //设置搜索栏宽度searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) { //确定提交相关return false;}@Overridepublic boolean onQueryTextChange(String newText) { //内容改变//制作模糊匹配查询String pattern = newText.trim();//避免两次观察的碰撞,先移除之前的观察filteredWords.removeObservers(requireActivity()); //不写这句会报错//根据筛选条件获取新的模糊查询添加观察filteredWords = wordViewModel.findWordsWithPattern(pattern);filteredWords.observe(requireActivity(), new Observer<List<Word>>() {@Overridepublic void onChanged(List<Word> words) { //onChanged()内部方法int temp = myAdapter1.getItemCount();myAdapter1.setAllWords(words);myAdapter2.setAllWords(words);if (temp!=words.size()) {myAdapter1.notifyDataSetChanged();myAdapter2.notifyDataSetChanged();}}});return true; //如果事件处理结束,则返回true}});}
...@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);wordViewModel = new ViewModelProvider(requireActivity()).get(WordViewModel.class);...filteredWords = wordViewModel.getAllWordsLive(); //一开始不过滤,显示所有内容filteredWords.observe(requireActivity(), new Observer<List<Word>>() {...}
}
- 至此搜索筛选功能完成:
制作清空数据功能和切换布局功能
菜单栏中的选项点击事件的实现在onOptionsItemSelected()中
复写该方法:
@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {//菜单栏的可选项点击事件的实现(本次为清空数据和切换视图)//多个菜单分类处理switch (item.getItemId()) {case R.id.clearData: //选中清空数据时弹出确认对话框AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());builder.setTitle("清空数据");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {wordViewModel.clearWords(); //确定时才从ViewModel中清空数据}});builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//取消时不做处理即可}});builder.create();builder.show();break;case R.id.switchViewType: //选中切换视图时//创建用户偏好设置SharedPreferences保存切换的视图(不设置会在切换视图做添加数据操作的时候回归普通视图)SharedPreferences sharedPreferences = requireActivity().getSharedPreferences(VIEW_TYPE_SHP, Context.MODE_PRIVATE);boolean viewType = sharedPreferences.getBoolean(IS_USING_CARDVIEW,false);SharedPreferences.Editor editor = sharedPreferences.edit();if (viewType) {//当前使用的时卡片布局recyclerView.setAdapter(myAdapter1); //改变为普通布局editor.putBoolean(IS_USING_CARDVIEW,false); //将用户偏好设置改变为false} else {recyclerView.setAdapter(myAdapter2);editor.putBoolean(IS_USING_CARDVIEW,true);}editor.apply(); //用户偏好设置存储}return super.onOptionsItemSelected(item);}
并在填充数据后通过用户偏好设置sharedPreferences保持原本界面布局(包括填充数据提交和重新进入界面)
@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);...//读取用户偏好设置SharedPreferences sharedPreferences = requireActivity().getSharedPreferences(VIEW_TYPE_SHP, Context.MODE_PRIVATE);boolean viewType = sharedPreferences.getBoolean(IS_USING_CARDVIEW,false);if (viewType) { //用户偏好卡片则设为卡片布局recyclerView.setAdapter(myAdapter2);} else {recyclerView.setAdapter(myAdapter1);}
...}
至此完成搜索与菜单栏的功能:界面如下
制作单词记录App(二)相关推荐
- 制作单词记录App(三)
制作单词记录App(三) 制作单词记录App(三) 改造Adapter为ListAdapter(用以处理后台提交的列表数据) 修正视图序号上的改变(变更为数据层面的序号改变) 制作添加数据时的数据信息 ...
- 制作单词记录App(一)
制作单词记录App(一) 制作单词记录App(一) 修正性能上的小bug 开始制作新单词界面 本文为学习类文档,通过学习B站up主longway777的视频,再加上自己的总结与理解的学习类文章,如有侵 ...
- Android-简单单词书app
Android-简单单词书app 一.项目目录结构 1.database目录:有关对数据库的操作及方法 2.Fragment目录:添加单词.背诵单词.显示其他功能界面的fragment对应的代码 3. ...
- 大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)
前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分 ...
- 苹果vs剪辑下载_好用的短视频制作与剪辑APP工具盘点
哈喽各位小伙伴儿~ 小漫已经太久没有更新啦,今天带给大家满满的干活哦~准备接招吧! 在移动化.碎片化消费日益盛行的当下,短视频成了最能反映年轻人生活方式的载体,在留存用户目光的道路上一骑绝尘.这点从抖 ...
- 中考词汇测试软件,中考英语单词必备app
中考英语单词必备app是专门为初中的朋友们为中考做准备的英语词汇单词记忆软件,这里有中考涵盖的非常齐全的词汇单词内容,详细的解释,支持学习背诵,语音读音,可以完成任务是背单词,帮助记录每天要记忆学习的 ...
- 磁带数据存储器制作过程记录
磁带数据存储器制作过程记录 前期准备20200805 同类产品 磁带硬件 电路硬件及控制芯片 制作20200819 电路图补充20210805 下阶段任务计划 未完待续------ 有交好的基佬说磁带 ...
- Linux学习记录(二)QEMU安装与Linux内核环境搭建
Linux学习记录(二) 记录本人学习的过程和遇到的问题 QEMU安装与Linux内核环境搭建 Linux学习记录(二) 一.QEMU安装 1.什么是QEMU 2.QEMU安装 二.Linux内核环境 ...
- 有没有免费制作证件照的app?手把手教你证件照制作
有没有免费制作证件照的app?一年一度的春节又过去啦,快乐的时光总是短暂的.随着新年佳节的逝去,接下来我们又要开始奋斗了,春天是一个怡人的时节,当然适合读书学习啦.我们在参加考试的时候,总是需要我们上 ...
最新文章
- mysql答题表设计_PHP+MYSQL问答系统中的提问和回答的表怎么设计
- python使用matplotlib可视化、使用rcParams参数调整可视化图像中线条宽度、线条类型、文本字体、字体大小、字体颜色、字体类型、文本颜色等
- 聊一聊:请假不想说真实原因,你都怎么跟领导讲?
- 【开发环境】Ubuntu 中使用 VSCode 开发 C/C++ ③ ( 创建工程目录 | 添加 C++ 源代码 | 代码自动提示 )
- ERROR: cannot start IntelliJ IDEA. No JDK found to run IDEA. Please validate either IDEA_JDK, JDK_HO
- 在多label 的代码里面添加augmentation功能遇到的问题
- 现在小餐厅的推广视频
- java隐式参数的作用_隐式参数_scala教程_田守枝Java技术博客
- 【转】对硬盘进行分区时,GPT和MBR区别。
- 2017中国之旅系列之十一:山西绵山之旅(上)
- js判断图片加载完成后再执行代码
- CentOS7 通过Systemctl实现脚本的开机自启(亲测有效)
- 阿里云,腾讯云,景安等谁家的备案流程比较简单?
- 基于51单片机的智能蓝牙路灯街灯控制系统proteus仿真原理图PCB
- 材料科学与工程毕业论文题目【313个】
- 十年架构师带来的Spring源码解析,极度深寒,程序员修炼内功必备
- jasypt 加解密的各个版本支持,看这一篇文章就够了
- 压力测试ab安装 linux,Centos8下安装ab压力测试工具及ab命令详解
- Android基础入门教程——1.6 .9(九妹)图片怎么玩
- Unity - TextMeshPro
热门文章
- Docker自动部署Apache Tomcat
- xshell使用SSH密钥登录Linux实例
- 嵌入式arm210开发板移植MP3的详细步骤
- 两种常用AD转换数字滤波方法
- java map增加值_Java程序以创建HashMap并添加键值对
- 数据挖掘-序列模式挖掘-prefixspan算法(样例)
- python12306买票_使用 py12306 购票
- Win10 1803 (17134)找回控制面板语言设定的方法
- OpenCV找圆系列(2)HoughCircles算子新增了HOUGH_GRADIENT_ALT方法,效果好多了
- 如何在互联网以最快速度赚够十万?