制作单词记录App(一)

  • 制作单词记录App(一)
    • 修正性能上的小bug
    • 开始制作新单词界面

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

制作单词记录App(一)

这次制作的单词记录App是根据前面学习的Room组件,migrantion等

修正性能上的小bug

在之前创建的MyAdapter中,针对词汇的点击跳转界面和开关隐藏中文意思,我们将点击事件放在了onBindViewHolder中,这个函数会被系统在运行过程中多次调用,会造成性能上的重复开销。
可以将其放在onCreateViewHolder中(创建一次即可)。

  1. 在onCreateViewHolder中定义itemView的ViewHolder对象
final MyViewHolder holder = new MyViewHolder(itemView);
  1. 调用holder的点击事件方法(处理word在创建时无法获取)
    @NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {...final MyViewHolder holder = new MyViewHolder(itemView);holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Uri uri = Uri.parse("http://dict.youdao.com/w/" + holder.textViewEnglish.getText() + "/#keyfrom=dict2.top");Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(uri);holder.itemView.getContext().startActivity(intent);}});holder.aSwitchChineseInvisible.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {Word word = (Word) holder.itemView.getTag(R.id.word_for_view_holder);//广义object要强制转换if (isChecked) {holder.textViewChinese.setVisibility(View.GONE);word.setChineseInvisible(true);wordViewModel.updateWords(word);} else {holder.textViewChinese.setVisibility(View.VISIBLE);word.setChineseInvisible(false);wordViewModel.updateWords(word);}}});return holder;  //改为返回holder类型}
  1. 在onBindViewHolder中定义word的itemView的setTag()方法(方便用户在create中使用getTag()方法获取数据。)
//itemView的setTag方法可以获取对象并在其他地方通过getTag获取对应对象holder.itemView.setTag(R.id.word_for_view_holder,word);
  1. 为了保证setTag在整个项目中保证全局唯一特性,设置int型参数,可以通过创建资源类将id存入以保证不冲突:
<?xml version="1.0" encoding="utf-8"?>
<resources><item name="word_for_view_holder" type="id"/>
</resources>
  1. 运行之后无变化,性能提高

开始制作新单词界面

  1. 创建两个fragement用来显示添加界面和单词显示界面
  2. 创建资源类navigation文件并链接两个fragement(wordfragement、addfragement),创建两者的动作联系。(可以自己选择制作进出动画)
  3. 在Activity中删除之前创建的控件并导入NavHostFragement入口(在container控件中)完成系统链接
  4. 在wordfragement搭建界面,放入一个recyclerView
  5. 填写wordfragement关联代码
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.Adapter;
import java.util.List;/*** A simple {@link Fragment} subclass.*/
public class WordsFragment extends Fragment {private WordViewModel wordViewModel;private RecyclerView recyclerView;private MyAdapter myAdapter1,myAdapter2;public WordsFragment() {// Required empty public constructor}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_words, container, false);}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);wordViewModel = new ViewModelProvider(requireActivity()).get(WordViewModel.class);recyclerView = requireActivity().findViewById(R.id.recyclerView);recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));myAdapter1 = new MyAdapter(false, wordViewModel);//第一个布局不适用卡片布局,所以为falsemyAdapter2 = new MyAdapter(true,wordViewModel);recyclerView.setAdapter(myAdapter1);wordViewModel.getAllWordsLive().observe(requireActivity(), new Observer<List<Word>>() {@Overridepublic void onChanged(List<Word> words) {int temp = myAdapter1.getItemCount();myAdapter1.setAllWords(words);myAdapter2.setAllWords(words);if (temp!=words.size()) {myAdapter1.notifyDataSetChanged();myAdapter2.notifyDataSetChanged();}}});}
}
  1. 删除之前在MainActivity中的代码并准备重写MainActivity代码(此处不该写也能运行之前制作的界面,原因是将activity中的大部分代码功能移植到了fragement中)
  2. 在wordsFragement中制作添加按键(使用自带的FloatingActionButton)
    创建矢量图标res->new->Vector Asset,选择add图标,背景色为白色,并创建。
    将FloatingActionButton拖动到界面中,并设置它的Layout_gravity(Bottom——true,CenterHorizontal——true)属性和Layout_margin属性
  3. 补充wordsFragement代码:
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
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.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.Adapter;import com.google.android.material.floatingactionbutton.FloatingActionButton;import java.util.List;/*** A simple {@link Fragment} subclass.*/
public class WordsFragment extends Fragment {
...private FloatingActionButton floatingActionButton; //定义变量
...@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);...floatingActionButton = requireActivity().findViewById(R.id.floatingActionButton);floatingActionButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {NavController navController = Navigation.findNavController(v);navController.navigate(R.id.action_wordsFragment_to_addFragment);}});}
}
  1. 在导航条设置返回按键:
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {private NavController navController;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);navController = Navigation.findNavController(findViewById(R.id.fragment));NavigationUI.setupActionBarWithNavController(this,navController);}@Overridepublic boolean onSupportNavigateUp() {navController.navigateUp();return super.onSupportNavigateUp();}
}
  1. 修改Fragement的Lable
  2. Add页面的制作:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/frameLayout"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".AddFragment" ><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="添加单词"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.1" /><EditTextandroid:id="@+id/editTextEnglish"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginStart="16dp"android:layout_marginEnd="16dp"android:ems="10"android:hint="English Word"android:inputType="textPersonName"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.2" /><EditTextandroid:id="@+id/editTextChinese"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginStart="16dp"android:layout_marginEnd="16dp"android:ems="10"android:hint="中文释义"android:inputType="textPersonName"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.3" /><Buttonandroid:id="@+id/buttonSubmit"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginStart="16dp"android:layout_marginEnd="16dp"android:text="Button"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.4" />
</androidx.constraintlayout.widget.ConstraintLayout>
  1. Add界面逻辑代码:
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;/*** A simple {@link Fragment} subclass.*/
public class AddFragment extends Fragment {private Button buttonSubmit;private EditText editTextEnglish,editTextChinese;private WordViewModel wordViewModel;public AddFragment() {// Required empty public constructor}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_add, container, false);}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);wordViewModel = new ViewModelProvider(requireActivity()).get(WordViewModel.class);buttonSubmit = requireActivity().findViewById(R.id.buttonSubmit);editTextEnglish = requireActivity().findViewById(R.id.editTextEnglish);editTextChinese = requireActivity().findViewById(R.id.editTextChinese);//有效信息不足时,按键设置为灰色状态buttonSubmit.setEnabled(false);//进入界面即可弹出键盘以节省操作,人性化体现editTextEnglish.requestFocus();//光标获取焦点InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE);imm.showSoftInput(editTextEnglish,0);//强制显示键盘,两个参数为(1. 关联的View;2. flag)//制作edit监听器TextWatcher textWatcher = new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {String english = editTextEnglish.getText().toString().trim();String chinese = editTextChinese.getText().toString().trim();buttonSubmit.setEnabled(!english.isEmpty() && !chinese.isEmpty());}@Overridepublic void afterTextChanged(Editable s) {}};//添加到edit中editTextEnglish.addTextChangedListener(textWatcher);editTextChinese.addTextChangedListener(textWatcher);//设置按键监听器,将数据存储到数据库中,并返回word界面buttonSubmit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String english = editTextEnglish.getText().toString().trim();String chinese = editTextChinese.getText().toString().trim();Word word = new Word(english,chinese);wordViewModel.insertWords(word); //数据添加NavController navController = Navigation.findNavController(v);navController.navigateUp();//返回界面时隐藏键盘的操作InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(v.getWindowToken(),0);//两个参数}});}}
  1. 处理因键盘弹出而自动压缩界面的操作:
    在清单文件中设置activity的windowSoftInputMode=“adjustNothing”——不做任何调整:
<activity android:name="com.example.words.MainActivity"android:windowSoftInputMode="adjustNothing">
  1. 处理因点击返回自设按键键盘不收回的设置:
    在MainActivity中的onSupportNavigateUp()中补充代码:
@Overridepublic boolean onSupportNavigateUp() {//返回界面时隐藏键盘的操作InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(findViewById(R.id.fragment).getWindowToken(),0);//两个参数navController.navigateUp();return super.onSupportNavigateUp();}
  1. 运行后可以将自己添加的单词释义加入其中:

制作单词记录App(一)相关推荐

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

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

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

    制作单词记录App(二) 制作单词记录App(二) 制作菜单 制作菜单和搜索功能的实现 制作清空数据功能和切换布局功能 本文为学习类文档,通过学习B站up主longway777的视频,再加上自己的总结 ...

  3. Android-简单单词书app

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

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

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

  5. android页面布局计算机,Android Studio制作简单计算器App

    Android Studio制作简单计算器App 计算机界面如图: 程序设计步骤: (1)在布局文件中声明编辑文件框EditText,按钮Button等组件. (2)在MainActivity中获取组 ...

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

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

  7. 制作一个手机APP软件需要拥有哪些资质证明?

    移动互联网+商业时代的井喷期已至.在你的事业蓝图中,是否早已打算好开发制作一个属于自己的APP应用平台呢?那么,在制作APP前应该有哪些准备工作,今天小编就带您了解一番,制作一个手机APP软件都需要拥 ...

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

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

  9. android便签工具下载,便签记录app下载-便签记录 安卓版v1.0.0-PC6安卓网

    便签记录app是一款手机掌上记事的备忘录软件,便签记录app界面清爽简约,功能非常的齐全且强大,通过便签记录软件轻松列出计划清单,创造备忘录. 软件介绍 便签记录app是一款非常实用的手机记事软件,软 ...

最新文章

  1. 05-01-部署 WSUS on Windows 2019 Core
  2. VMWare中CentOS系统不能上网的解决
  3. python字符串单个替换_如何用变量替换列表中的单个字符串?
  4. spring boot 异常设计原理
  5. boost::leaf::function_traits用法的测试程序
  6. linux怎样用命令提示符,Linux用户必知:一分钟掌握14个常用Linux命令行快捷键
  7. 《微软开源跨平台移动开发实践》团购通知
  8. 《SQL Server 2008从入门到精通》--20180716
  9. hibernate查询部分字段加struts2显示
  10. 软件应用:HexorBase Tool 实战测试!
  11. IDEA导出jar包步骤
  12. 惠普服务器故障代码_惠普服务器常见问题及故障排除
  13. IntelliJ IDEA设置字体样式
  14. Python爬虫编程思想(82):管理SQLite数据库
  15. 戴尔服务器系统缓存怎么清理,戴尔笔记本怎样清理磁盘空间
  16. Android 单个指定蓝牙设备通讯流程
  17. 综合布线系统施工规范
  18. matplotlib 多子图图例显示
  19. 计算任意年份的2月有多少天
  20. 你们吹捧的鸿蒙,只是另一个 Fuchsia

热门文章

  1. 育儿心得-红脸,白脸
  2. Ajax 技术汇总(转载)
  3. 【CYH-02】NOIp考砸后虐题赛:成绩:题解
  4. Web UI自动化基础
  5. 技术总结-从输入 URL 到页面加载完成的过程中都发生了什么事情?
  6. 手工雕刻图纸_手工玉石雕刻图样大全
  7. android 变windows7,安卓手机变电脑(iDisplay) v3.1.0 英文安装版 Win7/WinXP
  8. arguments的理解?
  9. 2345看图王批量重命名照片
  10. 恒星结构和演化-学习记录2-第三章-物态方程1