如何实现EditText的历史记录功能(关闭后再次打开显示上次的记录)?

内容:主要是实现从主Activity跳转到设置Activity,然后点击EditText进行参数设置(这里均是Number类型),参数需要限制类型、限制长度,同时在退出当前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("TimeWithCounts",
                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来说,每次输入都得回车一下才能赋值,不能点击第二个,然后让第一个焦点失去,赋值,有思路的兄弟给个建议。









发布了72 篇原创文章 · 获赞 42 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/xiaoxun2802/article/details/73614077