制作单词记录App(二)

  • 制作单词记录App(二)
    • 制作菜单
      • 制作菜单和搜索功能的实现
      • 制作清空数据功能和切换布局功能

本文为学习类文档,通过学习B站up主longway777的视频,再加上自己的总结与理解的学习类文章,如有侵权,请联系博主进行删除

制作单词记录App(二)

紧接着上次的继续做
完善查询功能和切换布局功能,制作清空功能

制作菜单

制作菜单和搜索功能的实现

res->new->resource file
type选择menu即可

  1. 制作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>
  1. 在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);}
  1. 制作工具条的内容功能
    设置搜索栏点击时,系统名不被隐藏的方法:
@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. 返回数据库底层制作查询功能:
    (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);}
  1. 在WordFragement中添加过滤后的词汇变量:

  2. 制作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>>() {...}
}
  1. 至此搜索筛选功能完成:

制作清空数据功能和切换布局功能

菜单栏中的选项点击事件的实现在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(二)相关推荐

  1. 制作单词记录App(三)

    制作单词记录App(三) 制作单词记录App(三) 改造Adapter为ListAdapter(用以处理后台提交的列表数据) 修正视图序号上的改变(变更为数据层面的序号改变) 制作添加数据时的数据信息 ...

  2. 制作单词记录App(一)

    制作单词记录App(一) 制作单词记录App(一) 修正性能上的小bug 开始制作新单词界面 本文为学习类文档,通过学习B站up主longway777的视频,再加上自己的总结与理解的学习类文章,如有侵 ...

  3. Android-简单单词书app

    Android-简单单词书app 一.项目目录结构 1.database目录:有关对数据库的操作及方法 2.Fragment目录:添加单词.背诵单词.显示其他功能界面的fragment对应的代码 3. ...

  4. 大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

       前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分 ...

  5. 苹果vs剪辑下载_好用的短视频制作与剪辑APP工具盘点

    哈喽各位小伙伴儿~ 小漫已经太久没有更新啦,今天带给大家满满的干活哦~准备接招吧! 在移动化.碎片化消费日益盛行的当下,短视频成了最能反映年轻人生活方式的载体,在留存用户目光的道路上一骑绝尘.这点从抖 ...

  6. 中考词汇测试软件,中考英语单词必备app

    中考英语单词必备app是专门为初中的朋友们为中考做准备的英语词汇单词记忆软件,这里有中考涵盖的非常齐全的词汇单词内容,详细的解释,支持学习背诵,语音读音,可以完成任务是背单词,帮助记录每天要记忆学习的 ...

  7. 磁带数据存储器制作过程记录

    磁带数据存储器制作过程记录 前期准备20200805 同类产品 磁带硬件 电路硬件及控制芯片 制作20200819 电路图补充20210805 下阶段任务计划 未完待续------ 有交好的基佬说磁带 ...

  8. Linux学习记录(二)QEMU安装与Linux内核环境搭建

    Linux学习记录(二) 记录本人学习的过程和遇到的问题 QEMU安装与Linux内核环境搭建 Linux学习记录(二) 一.QEMU安装 1.什么是QEMU 2.QEMU安装 二.Linux内核环境 ...

  9. 有没有免费制作证件照的app?手把手教你证件照制作

    有没有免费制作证件照的app?一年一度的春节又过去啦,快乐的时光总是短暂的.随着新年佳节的逝去,接下来我们又要开始奋斗了,春天是一个怡人的时节,当然适合读书学习啦.我们在参加考试的时候,总是需要我们上 ...

最新文章

  1. mysql答题表设计_PHP+MYSQL问答系统中的提问和回答的表怎么设计
  2. python使用matplotlib可视化、使用rcParams参数调整可视化图像中线条宽度、线条类型、文本字体、字体大小、字体颜色、字体类型、文本颜色等
  3. 聊一聊:请假不想说真实原因,你都怎么跟领导讲?
  4. 【开发环境】Ubuntu 中使用 VSCode 开发 C/C++ ③ ( 创建工程目录 | 添加 C++ 源代码 | 代码自动提示 )
  5. ERROR: cannot start IntelliJ IDEA. No JDK found to run IDEA. Please validate either IDEA_JDK, JDK_HO
  6. 在多label 的代码里面添加augmentation功能遇到的问题
  7. 现在小餐厅的推广视频
  8. java隐式参数的作用_隐式参数_scala教程_田守枝Java技术博客
  9. 【转】对硬盘进行分区时,GPT和MBR区别。
  10. 2017中国之旅系列之十一:山西绵山之旅(上)
  11. js判断图片加载完成后再执行代码
  12. CentOS7 通过Systemctl实现脚本的开机自启(亲测有效)
  13. 阿里云,腾讯云,景安等谁家的备案流程比较简单?
  14. 基于51单片机的智能蓝牙路灯街灯控制系统proteus仿真原理图PCB
  15. 材料科学与工程毕业论文题目【313个】
  16. 十年架构师带来的Spring源码解析,极度深寒,程序员修炼内功必备
  17. jasypt 加解密的各个版本支持,看这一篇文章就够了
  18. 压力测试ab安装 linux,Centos8下安装ab压力测试工具及ab命令详解
  19. Android基础入门教程——1.6 .9(九妹)图片怎么玩
  20. Unity - TextMeshPro

热门文章

  1. Docker自动部署Apache Tomcat
  2. xshell使用SSH密钥登录Linux实例
  3. 嵌入式arm210开发板移植MP3的详细步骤
  4. 两种常用AD转换数字滤波方法
  5. java map增加值_Java程序以创建HashMap并添加键值对
  6. 数据挖掘-序列模式挖掘-prefixspan算法(样例)
  7. python12306买票_使用 py12306 购票
  8. Win10 1803 (17134)找回控制面板语言设定的方法
  9. OpenCV找圆系列(2)HoughCircles算子新增了HOUGH_GRADIENT_ALT方法,效果好多了
  10. 如何在互联网以最快速度赚够十万?