app直播源码,android实现带下划线的密码输入框
app直播源码,android实现带下划线的密码输入框实现的相关代码
现在很多app的密码输入框,都采用微信、支付宝等密码输入框的样式。还有一种就是每个密码字符下面带有一条下划线的样式。
仿微信、支付宝网上搜了下有很多demo,但是带下划线的不多,或者讲的比较复杂,都是自定义什么的。这两天正好要做个这样的东西,研究了一下,感觉没那么麻烦,不需要各种自定义。我的思路是:
1). 布局中定义一个edittext, 全透明,输入的字符大小为0sp, 这样用户就看不见。不能设置为visibility=gone,否则无法获取焦点,弹 不出输入法。
2). 然后定义四个textview, 来显示edittext的输入。同时定义四个下划线,分别在每个textview的下方。
3). 监听edittext的输入事件,控制每个textview的显示
1. 布局文件:
1 | <br><?xml version= "1.0" encoding= "utf-8" ?><br><RelativeLayout<br> xmlns:android= "http://schemas.android.com/apk/res/android" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" ><br> <TextView<br> android:id= "@+id/input_title" <br> android:layout_width= "wrap_content" <br> android:layout_height= "wrap_content" <br> android:layout_marginLeft= "24dp" <br> android:layout_marginTop= "24dp" <br> android:text= "请输入密码" <br> android:textSize= "20sp" <br> android:textColor= "#333333" /><br> <EditText<br> android:id= "@+id/input_edit" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:gravity= "center_horizontal" <br> android:inputType= "number" <br> android:digits= "0123456789" <br> android:maxLength= "4" <br> android:maxLines= "1" <br> android:background= "@null" <br> android:cursorVisible= "false" <br> android:textColor= "#00000000" <br> android:textSize= "0sp" <br> android:visibility= "visible" /><br> <LinearLayout<br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:orientation= "horizontal" <br> android:layout_below= "@+id/input_title" <br> android:layout_marginLeft= "24dp" <br> android:layout_marginRight= "24dp" <br> android:layout_marginTop= "24dp" ><br> <LinearLayout<br> android:layout_width= "0dp" <br> android:layout_height= "wrap_content" <br> android:layout_weight= "1" <br> android:orientation= "vertical" <br> android:layout_marginRight= "45dp" <br> android:paddingBottom= "10dp" ><br> <TextView<br> android:id= "@+id/edit1" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:gravity= "center_horizontal" <br> android:inputType= "number" <br> android:digits= "0123456789" <br> android:maxLength= "1" <br> android:maxLines= "1" <br> android:background= "@null" <br> android:cursorVisible= "false" <br> android:textColor= "#333333" <br> android:textSize= "32sp" /><br> <TextView<br> android:id= "@+id/text1" <br> android:layout_width= "match_parent" <br> android:layout_height= "1dp" <br> android:background= "#767676" <br> android:layout_marginTop= "12dp" /><br> </LinearLayout><br> <LinearLayout<br> android:layout_width= "0dp" <br> android:layout_height= "wrap_content" <br> android:layout_weight= "1" <br> android:orientation= "vertical" <br> android:layout_marginRight= "45dp" <br> android:paddingBottom= "10dp" ><br> <TextView<br> android:id= "@+id/edit2" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:gravity= "center_horizontal" <br> android:inputType= "number" <br> android:digits= "0123456789" <br> android:maxLength= "1" <br> android:maxLines= "1" <br> android:background= "@null" <br> android:cursorVisible= "false" <br> android:textColor= "#333333" <br> android:textSize= "32sp" /><br> <TextView<br> android:id= "@+id/text2" <br> android:layout_width= "match_parent" <br> android:layout_height= "1dp" <br> android:background= "#767676" <br> android:layout_marginTop= "12dp" /><br> </LinearLayout><br> <LinearLayout<br> android:layout_width= "0dp" <br> android:layout_height= "wrap_content" <br> android:layout_weight= "1" <br> android:orientation= "vertical" <br> android:layout_marginRight= "45dp" <br> android:paddingBottom= "10dp" ><br> <TextView<br> android:id= "@+id/edit3" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:gravity= "center_horizontal" <br> android:maxLength= "1" <br> android:maxLines= "1" <br> android:background= "@null" <br> android:cursorVisible= "false" <br> android:textColor= "#333333" <br> android:textSize= "32sp" /><br> <TextView<br> android:id= "@+id/text3" <br> android:layout_width= "match_parent" <br> android:layout_height= "1dp" <br> android:background= "#767676" <br> android:layout_marginTop= "12dp" /><br> </LinearLayout><br> <LinearLayout<br> android:layout_width= "0dp" <br> android:layout_height= "wrap_content" <br> android:layout_weight= "1" <br> android:orientation= "vertical" <br> android:paddingBottom= "10dp" ><br> <TextView<br> android:id= "@+id/edit4" <br> android:layout_width= "match_parent" <br> android:layout_height= "wrap_content" <br> android:gravity= "center_horizontal" <br> android:inputType= "number" <br> android:digits= "0123456789" <br> android:maxLength= "1" <br> android:maxLines= "1" <br> android:background= "@null" <br> android:cursorVisible= "false" <br> android:textColor= "#333333" <br> android:textSize= "32sp" /><br> <TextView<br> android:id= "@+id/text4" <br> android:layout_width= "match_parent" <br> android:layout_height= "1dp" <br> android:background= "#767676" <br> android:layout_marginTop= "12dp" /><br> </LinearLayout><br> </LinearLayout><br></RelativeLayout> |
2. 实现代码
1 | private Dialog inputDialog;<br> private LayoutInflater mInflater;<br> private EditText input_edit;<br> private TextView edit1;<br> private TextView edit2;<br> private TextView edit3;<br> private TextView edit4;<br> private String codeStr = null ;<br> private void initInputDialogView(View view)<br>{<br> input_edit = (EditText) view.findViewById(R.id.input_edit);<br> input_edit.addTextChangedListener(mTextWatcher);<br> <br> edit1 = (TextView) view.findViewById(R.id.edit1);<br> edit2 = (TextView) view.findViewById(R.id.edit2);<br> edit3 = (TextView) view.findViewById(R.id.edit3);<br> edit4 = (TextView) view.findViewById(R.id.edit4);<br> <br> edit1.setOnClickListener(onClickListener);<br> edit2.setOnClickListener(onClickListener);<br> edit3.setOnClickListener(onClickListener);<br> edit4.setOnClickListener(onClickListener);<br>}<br> //创建输入框dialog<br>private void createInputDialog()<br>{<br> AlertDialog.Builder builder = new AlertDialog.Builder(this);<br> if (mInflater == null)<br> {<br> mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);<br> }<br> View view = mInflater.inflate(R.layout.input_view_layout, null);<br> initInputDialogView(view);<br> builder.setView(view);<br> inputDialog = null;<br> inputDialog = builder.create();<br> inputDialog.show();<br> openKeyboard(input_edit); //dialog show之后立即弹出输入法<br>}<br>//对四个显示密码textview监听点击事件,这样做是为了:如果输入法没有弹起来,用户点击密码框也是可以弹起来的<br>private View.OnClickListener onClickListener = new View.OnClickListener()<br>{<br> @Override<br> public void onClick(View v)<br> {<br> int vid = v.getId();<br> switch (vid)<br> {<br> case R.id.edit1:<br> case R.id.edit2:<br> case R.id.edit3:<br> case R.id.edit4:<br> openKeyboard(input_edit);<br> break;<br> }<br> }<br>}<br>//输入监听<br>private TextWatcher mTextWatcher = new TextWatcher()<br>{<br> @Override<br> public void beforeTextChanged(CharSequence s, int start, int count, int after)<br> {<br> }<br> @Override<br> public void onTextChanged(CharSequence s, int start, int before, int count)<br> {<br> }<br> @Override<br> public void afterTextChanged(Editable s)<br> {<br> /**<br> * 我的处理逻辑是:1. 只能从第一个框输入;2.只能从最后一次输入的框删除<br> * 3. 如果输入的密码个数小于4(我这里总共4个), 也是可以删除的。4.按了删除键,还可以继续接着输入,保证每一次输入,显示的位置都是对的。<br> **/<br> int len = s.length();<br> String str = s.toString();<br> codeStr = str;<br> switch (len)<br> {<br> case 1:<br> edit1.setText(str);<br> edit2.setText("");<br> edit3.setText("");<br> edit4.setText("");<br> break;<br> case 2:<br> edit2.setText(subStr(str, 1, 2));<br> edit3.setText("");<br> edit4.setText("");<br> break;<br> case 3:<br> edit3.setText(subStr(str, 2, 3));<br> edit4.setText("");<br> break;<br> case 4:<br> edit4.setText(subStr(str, 3, 4));<br> break;<br> default:<br> edit1.setText("");<br> break;<br> }<br> }<br>};<br>private String subStr(String s, int start, int end)<br>{<br> if (s == null || s.length() < 1)<br> {<br> return "";<br> }<br> return s.substring(start, end);<br>}<br>//弹起输入法<br>public static void openKeyboard(final EditText view)<br>{<br> view.setFocusableInTouchMode(true);<br> view.setFocusable(true);<br> view.setClickable(true);<br> view.requestFocus();<br> InputMethodManager inputManager = (InputMethodManager)view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);<br> inputManager.showSoftInput(view, 0);<br> Timer timer = new Timer();<br> timer.schedule(new TimerTask()<br> {<br> public void run()<br> {<br> InputMethodManager inputManager=(InputMethodManager)view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);<br> inputManager.showSoftInput(view,0);<br> }<br> }, 500);<br>} |
3. 最后在合适的地方调用createInputDialog()方法就能弹出密码框,并且同时弹起输入法。
以上就是 app直播源码,android实现带下划线的密码输入框实现的相关代码,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现