首页 >> 大全

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

2023-06-18 大全 49 作者:考证青年

制作单词记录App(二)

本文为学习类文档,通过学习B站up主的视频,再加上自己的总结与理解的学习类文章,如有侵权,请联系博主进行删除 制作单词记录App(二)

紧接着上次的继续做

完善查询功能和切换布局功能,制作清空功能

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

res->new-> file

type选择menu即可

制作menu界面

拖动两个Menu Item和一个 Item至布局中,改写id和title

默认的搜索栏在menu下拉列表中,需要设置属性使其在导航栏中显示,如下图所示




在中复写函数()来添加刚创建的menu

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main_menu,menu);return super.onCreateOptionsMenu(menu);}

即可在所有界面添加该菜单,但不是我们想要的效果,因为在第二个添加界面我们不需要搜索框等工具,因此本次项目需要在对应的中复写上述函数:

在中复写函数:由于中默认不显示菜单,所以我们需要在构造方法中设置显示拥有菜单为真

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)在中添加模糊查询功能代码:

@Query("SELECT * FROM WORD WHERE english_word LIKE :pattern ORDER BY ID DESC")LiveData> findWordsWithPattern(String pattern);

(2)在中添加代码:

LiveData> findWordsWithPattern(String pattern) {return wordDao.findWordsWithPattern("%" + pattern + "%");  //通配符保证模糊匹配}

(3)在中添加代码:

LiveData> findWordsWithPattern(String pattern) {return wordRepository.findWordsWithPattern(pattern);}

在中添加过滤后的词汇变量:

制作中的搜索栏的监听器:

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> 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>() {@Overridepublic void onChanged(List 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>() {...}
}

至此搜索筛选功能完成:

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

菜单栏中的选项点击事件的实现在d()中

复写该方法:

@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);}

并在填充数据后通过用户偏好设置保持原本界面布局(包括填充数据提交和重新进入界面)

@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);}
...}

至此完成搜索与菜单栏的功能:界面如下

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了