Android EditText输入框实现下拉且保存最近5个历史记录
程序员文章站
2022-06-15 14:03:59
文章结构: 一、需求阐述 技术部同事提出想要在APP上保存最近输入成功的5个密钥信息,同时支持可以下拉进行选择。 这也是为了方便客户在现在多次输入信息,帮助其快速进行输入。 二、实现思路: 目前想要实现的需求 1、想要实现保存用户输入的密钥信息。 2、通过点击右侧的下拉来触发,让用户去选择已经发送成 ......
文章结构:
一、需求阐述
技术部同事提出想要在app上保存最近输入成功的5个密钥信息,同时支持可以下拉进行选择。
这也是为了方便客户在现在多次输入信息,帮助其快速进行输入。
二、实现思路:
目前想要实现的需求
1、想要实现保存用户输入的密钥信息。
2、通过点击右侧的下拉来触发,让用户去选择已经发送成功的信息。
3、通过sharedpreferences来保存每次app退出后的数据。
4、当发送成功后,更新后台的存储数据,进行逻辑判断。
三、代码逻辑
下面图片是最终的实现效果,当输入标识和密钥,点击发送按钮,成功后将数据自动保存到后台的数组中。点击右侧的下拉图标后,在将其弹出。
后面又添加了清空历史记录的标签,就是在每一次添加更新后台数组后,数组的下一个标签为清空历史记录。
1 s_btndown.setonclicklistener(this); //对其进行焦点监听
1 case r.id.btndown: 2 showlistpopulwindow(); //调用显示popuwindow 函数 3 break;
点击后触发popuwindow函数,也就是将其下拉框,绑定到textbox标签的下面。
1 private void showlistpopulwindow() { 2 final devicekeysecretmanager list = ((mainactivity)getactivity()).devicekeysecretmanager;//要填充的数据 3 final listpopupwindow listpopupwindow; 4 listpopupwindow = new listpopupwindow(getactivity()); 5 listpopupwindow.setadapter(new arrayadapter<string>(getactivity(), android.r.layout.simple_list_item_1, list.getkeylist()));//用android内置布局,或设计自己的样式 6 listpopupwindow.setanchorview(s_etappkey); //以哪个控件为基准,在该处以medittext为基准 7 listpopupwindow.setmodal(true); 8 9 listpopupwindow.setonitemclicklistener(new adapterview.onitemclicklistener() { //设置项点击监听 10 @override 11 public void onitemclick(adapterview<?> adapterview, view view, int i, long l) { 12 if (list.keysecretsum==i){ 13 list.clear(); //点击清空 14 s_etappkey.settext(""); //把选择的选项内容展示在edittext上 15 s_etappsecret.settext(""); 16 }else{ 17 s_etappkey.settext(list.getkeylist()[i]); //把选择的选项内容展示在edittext上 18 s_etappsecret.settext(list.getsecretlist()[i]); 19 } 20 21 listpopupwindow.dismiss(); //如果已经选择了,隐藏起来 22 } 23 }); 24 listpopupwindow.show(); //把listpopwindow展示出来 25 }
密钥管理的逻辑类:
用于在发送成功后将历史密钥信息进行缓存,后期将其绑定到下拉列表中,也为了在app退出和首次加载时,将数据保存和提取到缓存中。
1 /** 2 * 标识和密钥管理 3 * 最多只存储5个密钥,超过5个就开始进行循环覆盖(从第一个开始)。 4 */ 5 class devicekeysecretmanager { 6 7 public devicekeysecretmanager() { 8 currentsaveindex = 0; 9 } 10 11 public string[] getkeylist() { 12 return keylist; 13 } 14 15 public string[] getsecretlist() { 16 return secretlist; 17 } 18 19 /** 20 * 添加新到的key和secret到密钥库 21 * 1、先判断密钥库中是否存在key,如果存在则直接更新其secret值, 22 * 2、不存在则直接进行添加key/secret值。 23 */ 24 public void addbufferkeyandsecret(string key, string secret) { 25 if (integerconversion.useloop(keylist,key)) { 26 int index=0; 27 for (int i=0;i<keylist.length;i++) { 28 if (keylist[i].equals(key)){ 29 index=i; 30 break; 31 } 32 } 33 keylist[index]=key; 34 secretlist[index]=secret; 35 } else { 36 if (keysecretsum == 5) { 37 currentsaveindex = currentsaveindex == 5 ? 0 : currentsaveindex; 38 keylist[currentsaveindex] = key; 39 secretlist[currentsaveindex] = secret; 40 currentsaveindex++; 41 } else { 42 keylist[currentsaveindex] = key; 43 secretlist[currentsaveindex] = secret; 44 currentsaveindex++; 45 keysecretsum++; 46 keylist[currentsaveindex] = "清空历史记录"; 47 } 48 } 49 } 50 51 public void clear() { 52 currentsaveindex = 0; 53 keysecretsum = 0; 54 55 for (int i = 0; i < keylist.length; i++) { 56 keylist[i] = null; 57 } 58 59 for (int i = 0; i < secretlist.length; i++) { 60 secretlist[i] = null; 61 } 62 } 63 64 public int currentsaveindex = 0; //当前保存的序号 65 public int keysecretsum = 0; //key的总个数,最多存储5个。 66 private string[] keylist = new string[6]; 67 private string[] secretlist = new string[5]; 68 }
app退出和首次加载时,对数据在本地进行保存和提取;
1 /** 2 * 读取保存的文件 3 */ 4 private void getsavedpreference() { 5 try { 6 sharedpreferences pref = this.getsharedpreferences(getresources().getstring(r.string.app_name), mode_private); 7 int sum=pref.getint("keysecretsum", 0); 8 9 for (int i=0;i<=sum;i++){ 10 devicekeysecretmanager.getkeylist()[i]=pref.getstring("key"+i, ""); 11 } 12 13 for (int i=0;i<sum;i++){ 14 devicekeysecretmanager.getsecretlist()[i]=pref.getstring("secret"+i, ""); 15 } 16 17 devicekeysecretmanager.currentsaveindex=sum==5?0:sum; 18 devicekeysecretmanager.keysecretsum=sum; 19 } catch (exception ex) { 20 21 } 22 } 23 24 /** 25 * 保存文件 26 * */ 27 private void setsavepreference() { 28 try { 29 sharedpreferences pref = getsharedpreferences(getresources().getstring(r.string.app_name), mode_private); 30 sharedpreferences.editor edit = pref.edit(); 31 edit.putint("keysecretsum", devicekeysecretmanager.keysecretsum); //现有保存的总个数 32 33 for (int i=0;i<=devicekeysecretmanager.keysecretsum;i++){ 34 edit.putstring("key"+i, devicekeysecretmanager.getkeylist()[i]); 35 } 36 37 for (int i=0;i<devicekeysecretmanager.keysecretsum;i++){ 38 edit.putstring("secret"+i, devicekeysecretmanager.getsecretlist()[i]); 39 } 40 edit.commit(); 41 } catch (exception ex) { 42 43 } 44 }
下面是当发送成功后的业务逻辑:
1 @override 2 public void onclick(view v) { 3 switch (v.getid()) { 4 case r.id.btnsenddata: 5 if (!devicemanager.getinstance().deviceisconnected()) { 6 tu.toastshow(context, "设备已断开连接,无法进行通讯。"); 7 return; 8 } 9 if (devicemanager.getinstance().deviceisbusy()) { 10 tu.toastshow(context, "设备忙碌,请等待..."); 11 return; 12 } 13 try { 14 string key,secret; 15 key=s_etappkey.gettext().tostring(); 16 secret=s_etappsecret.gettext().tostring(); 17 18 if (key.length()<=0||secret.length()<=0|| 19 textutils.isempty(key)||textutils.isempty(secret)){ 20 tu.toastshow(context, "标识和密钥不能为空!"); 21 return; 22 } 23 24 //调用方法拼接字符串,发送给下位机设备。 25 int nresult = devicemanager.getinstance().writertkdata(context, new byte[]{}); 26 if (nresult > 0) { 27 tu.toastshow(context, "参数写入成功"); 28 29 ((mainactivity)getactivity()).devicekeysecretmanager.addbufferkeyandsecret(key,secret); 30 } 31 } catch (exception ex) { 32 tu.toastshow(context, "参数写入失败!"); 33 } 34 break; 35 case r.id.btncleardata: //只清空当前的标识和密钥 36 s_etappkey.settext(""); 37 s_etappsecret.settext(""); 38 break; 39 case r.id.btndown: 40 showlistpopulwindow(); //调用显示popuwindow 函数 41 break; 42 default: 43 break; 44 } 45 }
总结:
通过上面的业务分析,代码实现就可以实现具体的需求,保存下最近5个的历史记录。
其实对于写程序而言,难的不是语法和技巧,而是编程思想,对于同一个问题/需求,不同的人有不同的解决办法,谁也不能说谁的方法是错误的,只能说谁的方法是目前为止最有效的。
小寄语
一个人的奋斗,像怀孕一样,日子久了,总会被看出来的。
人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。
我是哉说,谢谢您的阅读,希望和你一起进步、成长。
如果对您有帮助,麻烦点赞,转发。