内容:主要是实现从主Activity跳转到设置Activity,然后点击EditText进行参数设置(这里均是Number类型),参数需要限制类型、限制长度,同时在退出当前Activity或者关闭应用再次打开后,可以自动显示最近的历史参数记录。
实现的方式:Android studio,一个敲码很爽的键盘,一首轻快的民谣外加一个思考的大脑
一、基本属性
言归正传,一步一步来写,首先是EditText的基本属性设置,这里分为两部分,一部分是“好看”的属性,即UI属性;另一部分是“编辑”属性,即关于焦点什么的。这里先说一下UI属性,包括字体的大小、颜色、位置,以及背景等等,例如我们经常见到的一个方框类型的EditText,就可以利用background这个属性进行设置,代码如下:
效果如下:
如果设置输入数值的位置,可以利用gravity这个属性,其他的属性这里就不再叙述。
对于编辑属性,这里主要是说获取焦点的问题。正常的(默认未修改的)带有EditText控件的Activity在打开时,都会默认的将焦点聚集在EditText上,弹出软键盘,但是用户体验会很差,我们需要的是点击该控件再进行编辑,所以对于焦点的把握很重要。
关于如何隐藏软键盘或者一开始让EditText失去焦点的方法有很多,这里我写两种:
1.焦点转移,利用一个看不见摸不着的View来获取焦点
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);
}
在进行读取数据赋值的时候,先判断一下该数据是否为空,如果是空,则执行初始化方法,如果非空,则赋值,这样就实现了读取上次记录的功能。
源码下载地址:
存在的问题:在上述我使用了回车键判断输入是否完成,也就是说在每次输入完成的时候,必须点击回车键才能结束输入,进行赋值,这样的用户体验比较差,因为对于有两个及以上EditText控件的Activity来说,每次输入都得回车一下才能赋值,不能点击第二个,然后让第一个焦点失去,赋值,有思路的兄弟给个建议。
发表评论