如何实现EditText的历史记录功能(关闭后再次打开显示上次的记录)?
2017-06-23 15:12
2531 查看
内容:主要是实现从主Activity跳转到设置Activity,然后点击EditText进行参数设置(这里均是Number类型),参数需要限制类型、限制长度,同时在退出当前Activity或者关闭应用再次打开后,可以自动显示最近的历史参数记录。
实现的方式:Android studio,一个敲码很爽的键盘,一首轻快的民谣外加一个思考的大脑
一、基本属性
言归正传,一步一步来写,首先是EditText的基本属性设置,这里分为两部分,一部分是“好看”的属性,即UI属性;另一部分是“编辑”属性,即关于焦点什么的。这里先说一下UI属性,包括字体的大小、颜色、位置,以及背景等等,例如我们经常见到的一个方框类型的EditText,就可以利用background这个属性进行设置,代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201706/25df2a014784ea08fc457ac1ddff9760)
如果设置输入数值的位置,可以利用gravity这个属性,其他的属性这里就不再叙述。
对于编辑属性,这里主要是说获取焦点的问题。正常的(默认未修改的)带有EditText控件的Activity在打开时,都会默认的将焦点聚集在EditText上,弹出软键盘,但是用户体验会很差,我们需要的是点击该控件再进行编辑,所以对于焦点的把握很重要。
关于如何隐藏软键盘或者一开始让EditText失去焦点的方法有很多,这里我写两种:
1.焦点转移,利用一个看不见摸不着的View来获取焦点
这部分主要的有两点,一个是限制输入长度,一个是判断输入完成或者是输入为空,在网上埋头搜索了很多,均是使用TextWatcher来进行限制的,这种方法很好,而且也很好用,但是在结合SharedPrefences进行数据存储时,使用起来不太方便,所以我就简单的直接使用了EditText的setOnEditorActionListener方法,一方面可以监听输入是否完成,另一方面,可以更加简单的对长度进行限制,先放代码:
三、历史记录
1.数据存储
因为涉及到数据存储,而且是简单数据的存储,所以我使用了SharedPreferences来存储数据,部分代码如下:
存储:
这里比较关键的是如何判断是否是第一次启动该Activity,逻辑首先得理清楚,清楚了这个顺序流程,然后我们就可以在代码中考虑了。
第一次打开设置界面进行设置,保存参数数据,关闭。
第二次打开设置界面,读取SharedPreferences保存的数据,显示上次设置的参数。
(1).判断
如何判断和在什么时候判断呢?在重新将Activity的生命周期仔细体会后,发现,无论是从一个Activity到另一个Activity还是一个应用到另一个应用,一旦该Activity显示在前台的时候,都要执行onCreate、onStart、onResume方法,所以我将判断放在了onStart方法中。代码如下:
源码下载地址:http://download.csdn.net/detail/xiaoxun2802/9878772
存在的问题:在上述我使用了回车键判断输入是否完成,也就是说在每次输入完成的时候,必须点击回车键才能结束输入,进行赋值,这样的用户体验比较差,因为对于有两个及以上EditText控件的Activity来说,每次输入都得回车一下才能赋值,不能点击第二个,然后让第一个焦点失去,赋值,有思路的兄弟给个建议。
实现的方式:Android studio,一个敲码很爽的键盘,一首轻快的民谣外加一个思考的大脑
一、基本属性
言归正传,一步一步来写,首先是EditText的基本属性设置,这里分为两部分,一部分是“好看”的属性,即UI属性;另一部分是“编辑”属性,即关于焦点什么的。这里先说一下UI属性,包括字体的大小、颜色、位置,以及背景等等,例如我们经常见到的一个方框类型的EditText,就可以利用background这个属性进行设置,代码如下:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/white"/> <corners android:radius="3dp"/> <stroke android:width="0.5px" android:color="@color/Dividing_line"/> </shape>效果如下:
如果设置输入数值的位置,可以利用gravity这个属性,其他的属性这里就不再叙述。
对于编辑属性,这里主要是说获取焦点的问题。正常的(默认未修改的)带有EditText控件的Activity在打开时,都会默认的将焦点聚集在EditText上,弹出软键盘,但是用户体验会很差,我们需要的是点击该控件再进行编辑,所以对于焦点的把握很重要。
关于如何隐藏软键盘或者一开始让EditText失去焦点的方法有很多,这里我写两种:
1.焦点转移,利用一个看不见摸不着的View来获取焦点
<View android:layout_width="0dp" android:layout_height="0dp" android:focusableInTouchMode="true"/>2.直接在属性设置中设置
android:focusableInTouchMode="false"二、输入设置
这部分主要的有两点,一个是限制输入长度,一个是判断输入完成或者是输入为空,在网上埋头搜索了很多,均是使用TextWatcher来进行限制的,这种方法很好,而且也很好用,但是在结合SharedPrefences进行数据存储时,使用起来不太方便,所以我就简单的直接使用了EditText的setOnEditorActionListener方法,一方面可以监听输入是否完成,另一方面,可以更加简单的对长度进行限制,先放代码:
editTimes.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { Times = v.getText().toString(); if (Times.trim().equals("")) {//判断EditText是否为空 Toast.makeText(SettingsActivity.this, "输入不能为空,请重新输入!", Toast.LENGTH_SHORT).show(); editTimes.setText(null); } else { int value = Integer.parseInt(Times); while (true) { if (value < 5) { Toast.makeText(SettingsActivity.this, "允许输入范围:5~10000,请重新输入!", Toast.LENGTH_SHORT).show(); editTimes.setText(null); } else if (value > 10000) { Toast.makeText(SettingsActivity.this, "允许输入范围:5~10000,请重新输入!", Toast.LENGTH_SHORT).show(); editTimes.setText(null); } else { editTimes.setEnabled(false); SampleTimes = Integer.parseInt(editTimes.getText().toString()); System.out.println(SampleTimes + "*****"); } return true; } } } return true; } });利用软键盘的回车键作为输入结束键,Times作为全局变量,获取到输入内容,然后进行判断,判断输入是否为空的方法是v.getText().toString().trim().equals("")。接下来,就是关于限制输入长度,长度设置是5~10000,当输入小于5时,显示Toast,并强制清空editText,同样,当输入大于10000时,也是强制清空editText,当输入在限制范围内时,点击回车键,使该控件不可获取焦点,将修改后的值传递出去。
三、历史记录
1.数据存储
因为涉及到数据存储,而且是简单数据的存储,所以我使用了SharedPreferences来存储数据,部分代码如下:
存储:
SharedPreferences sharedPreferences = getSharedPreferences("TimeWithCounts", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("times", editTimes.getText().toString()); editor.putString("counts", editCounts.getText().toString()); editor.commit();读取:
SharedPreferences sharedPreferences = getSharedPreferences("TimeWithCounts", Activity.MODE_PRIVATE); String times = sharedPreferences.getString("times", ""); String counts = sharedPreferences.getString("counts", "");2.历史记录
这里比较关键的是如何判断是否是第一次启动该Activity,逻辑首先得理清楚,清楚了这个顺序流程,然后我们就可以在代码中考虑了。
第一次打开设置界面进行设置,保存参数数据,关闭。
第二次打开设置界面,读取SharedPreferences保存的数据,显示上次设置的参数。
(1).判断
如何判断和在什么时候判断呢?在重新将Activity的生命周期仔细体会后,发现,无论是从一个Activity到另一个Activity还是一个应用到另一个应用,一旦该Activity显示在前台的时候,都要执行onCreate、onStart、onResume方法,所以我将判断放在了onStart方法中。代码如下:
SharedPreferences settings = getSharedPreferences("Selector", 0); Boolean user_first = settings.getBoolean("FIRST", true); if (user_first) { settings.edit().putBoolean("FIRST", false).commit(); parameterSettings(); } else { readParameter(); parameterSettings(); }其中,parameterSettings()为上面的限制长度的函数,readParameter()为读取SharedPreferences存储的数据函数。 如果是第一次启动Activity,则执行初始方法,如果是第二次打开就先执行读取数据方法,再执行初始方法,用来修改参数。但是你会发现,如果这样,还会存在一个问题,就是如果第一次启动设置Activity,并没有设置参数,那么SharedPreferences就不会有数据保存,那么在第二次启动时,执行read函数就会报空指针错误,而且这也是很大的一个问题,会导致程序奔溃,所以我在readParameters函数中添加了判断语句,代码如下:
SharedPreferences sharedPreferences = getSharedPreferences("TimeWithCo 4000 unts", Activity.MODE_PRIVATE); String times = sharedPreferences.getString("times", ""); String counts = sharedPreferences.getString("counts", ""); if (times == "" | counts == "") { parameterSettings(); } else { editTimes.setText(times); editCounts.setText(counts); SampleTimes = Integer.parseInt(times); SampleCounts = Integer.parseInt(counts); }在进行读取数据赋值的时候,先判断一下该数据是否为空,如果是空,则执行初始化方法,如果非空,则赋值,这样就实现了读取上次记录的功能。
源码下载地址:http://download.csdn.net/detail/xiaoxun2802/9878772
存在的问题:在上述我使用了回车键判断输入是否完成,也就是说在每次输入完成的时候,必须点击回车键才能结束输入,进行赋值,这样的用户体验比较差,因为对于有两个及以上EditText控件的Activity来说,每次输入都得回车一下才能赋值,不能点击第二个,然后让第一个焦点失去,赋值,有思路的兄弟给个建议。
相关文章推荐
- Notepad++如何关闭最近打开的文件的历史记录功能
- 简单实现Android搜索功能 显示清除历史搜索记录
- 如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开
- Android编程实现的EditText弹出打开和关闭工具类
- Python高级编程-如何实现用户的历史记录功能?
- 如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开
- Android-AutoCompleteTextView实现历史搜索记录显示
- 简单实现Android搜索功能 显示清除历史搜索记录
- 如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开
- 如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开
- python-5-如何实现用户的历史记录功能(最多n条)?
- ApplicationSettingsBase: 关掉WPF 窗口后,再次打开,显示在上次关闭的位置
- 如何实现用户的历史记录功能(最多n条)
- android下如何实现EditText显示隐藏密码的实现,
- 如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开
- win8系统如何让任务栏不显示最近打开项目(浏览的历史记录)
- listview获取edittext中输入的数据,显示,并且实现可删除功能
- Win8.1如何清除可靠性历史记录关闭历史记录功能
- 实现Android搜索功能 显示清除历史搜索记录
- EditText和数据库结合使用,类似淘宝搜索功能及历史记录