EditText(输入框)解读1.设置默认提示文字
如右图,相信你对这些用户登录界面并不陌生吧,我们经常使用这些界面
以下与其他相比如何?
还不错吧,其实这里就不贴布局了,这里只介绍默认提示文字的两个控件属性:
默认提示文本的两个属性如下:
android:hint="默认提示文本" android:textColorHint="#95A1AA"
后者设置提示文字内容,前者设置提示文字颜色!
2.获得焦点后选中组件中的所有文本内容
当我们想要点击输入框获得焦点时,不是将光标连接到文本的开头或结尾,而是想要获得输入框中的所有文本内容!这时候我们可以使用selectAllOnFocus属性
android:selectAllOnFocus="true"
比如下图的疗效图:第一个设置了这个属性,第二个没有设置这个属性。设置为true的EditText获得焦点后,所有文本都被选中!
3.限制 EditText 输入类型
有时我们可能需要限制输入数据。比如输入电话号码时,输入一串字母,这似乎与我们的预期不符,而限制输入类型可以通过inputType属性来实现!
例如限制只能是电话号码、密码(textPassword):
可选参数如下:
文本类型,多为小写、小写和数字符号
android:inputType="none" android:inputType="text" android:inputType="textCapCharacters" android:inputType="textCapWords" android:inputType="textCapSentences" android:inputType="textAutoCorrect" android:inputType="textAutoComplete" android:inputType="textMultiLine" android:inputType="textImeMultiLine" android:inputType="textNoSuggestions" android:inputType="textUri" android:inputType="textEmailAddress" android:inputType="textEmailSubject" android:inputType="textShortMessage" android:inputType="textLongMessage" android:inputType="textPersonName" android:inputType="textPostalAddress" android:inputType="textPassword" android:inputType="textVisiblePassword" android:inputType="textWebEditText" android:inputType="textFilter" android:inputType="textPhonetic"
数字类型
android:inputType="number" android:inputType="numberSigned" android:inputType="numberDecimal" android:inputType="phone"//拨号键盘 android:inputType="datetime" android:inputType="date"//日期键盘 android:inputType="time"//时间键盘
4.设置最小行、最大行、单行、多行、手动换行
EditText默认多行显示,也可以手动换行,即当一行无法显示时,会手动换行到第二行
我们可以限制它,例如
设置最小行数:android:minLines="3"
或者设置EditText的最大行数:android:maxLines="3"
PS:当输入内容超过maxline时,文字会自动向上滚动! !
另外,很多时候我们可能想限制EditText只允许单行输入,不能滚动,比如前面登录界面的例子,我们只需要设置
android:singleLine="true"
不用换行也可以实现单行输入
5.设置文字间距,设置英文字母的小写类型
我们可以通过以下两个属性来设置字的宽度:
android:textScaleX="1.5" //设置字与字的水平间隔 android:textScaleY="1.5" //设置字与字的垂直间隔
此外,EditText还为我们提供了一个属性来设置英文字母的小写类型:android:capitalize默认为none,并提供了三个可选值:
6.控制EditText周围的距离以及内部文本与边框的距离
我们使用margin相关的属性来减小组件相对于其他控件的距离,例如android:marginTop="5dp" 并使用padding来减小组件内部的文本与组件边框的距离,比如android:paddingTop="5dp"
7.设置EditText获取焦点的同时弹出一个小按钮
关于这个EditText获得焦点并弹出小按钮的问题,前不久在项目中苦恼了一段时间。要求是:进入Activity后,让EditText获得焦点,弹出小按钮供用户输入!网上的方法试了很多,不知道是不是作者使用的系统5.1的问题!总结如下:
首先是让EditText获得焦点并清除焦点
edit.requestFocus();//请求获得焦点
edit.clearFocus();//移除焦点
获得焦点后,弹出一个小按钮,我大部分时间都花在了这个上:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
第二:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(view,InputMethodManager.SHOW_FORCED); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘
我不知道是什么原因。前面两种方法都没有弹出小按钮。作者最终使用 :windowSoftInputMode 属性解决了弹出小按钮的问题。在这里跟大家分享一下:
android:windowSoftInputModeActivity 主窗口与软键的交互模式,可用于防止输入法面板阻塞问题,Android1.5之后的新功能。
这个属性会影响两件事:
【一】当焦点形成时,软键是隐藏还是显示
[2] 是否减小活动主窗口的大小为软键腾出空间
简单点就是有焦点时的按钮控制,以及是否缩小Act的窗口大小并用它来放小按钮
以下值可供选择,可设置多个值,用“|”隔开
stateUnspecified:未指定软键的状态,系统会选择合适的状态或主题相关的设置
stateUnchanged:当这个activity出现时,软键会一直保持上一个activity的状态,无论是隐藏还是显示
stateHidden:当用户选择活动时,软键总是隐藏
stateAlwaysHidden:当Activity主窗口获得焦点时,软键始终隐藏
stateVisible:软键通常可见
stateAlwaysVisible:当用户选择activity时,软键始终显示状态
adjustUnspecified:默认设置,通常由系统决定是隐藏还是显示
adjustResize:Activity 总是调整屏幕的大小为软键腾出空间
adjustPan:将手动连接当前窗口的内容,使当前焦点永远不会被按键覆盖,用户始终可以听到部分输入
我们可以在AndroidManifest.xml中为需要弹出小按钮的Activity设置这个属性,例如:
之后就可以在EditText对象中requestFocus()了~
8.EditText 光标位置控制
有时我们可能需要在EditText中控制光标连接到指定位置或选择单个文本!
EditText为我们提供了setSelection()方法,有两种方式:
一个参数用于设置光标位置,两个参数用于设置开始位置和结束位置的中间括号,即部分选择!
其实我们也可以调用setSelectAllOnFocus(true);当 EditText 获得焦点时选择所有文本!
此外,我们还可以调用 setCursorVisible(false);设置光标不显示
也可以调用getSelectionStart()和getSelectionEnd来获取当前光标的前后位置
9.带有表情的EditText的简单实现
相信你对QQ或陌陌很熟悉。当我们发送文本时安卓输入框为空,我们可以将它们与表情符号一起发送。有两种简单的方法可以实现这一点:
1.使用 SpannableString 实现
2.使用Html类实现
这里作者使用第一个。这里只实现了一个简单的效果。可以提取方法,自定义一个EditText;
你也可以自己写一个类似于QQ的多个表情选项的输入框!
看疗效图(点击添加表情即可完成表情添加):
代码也很简单:
public class MainActivity extends Activity { private Button btn_add; private EditText edit_one; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_add = (Button) findViewById(R.id.btn_add); edit_one = (EditText) findViewById(R.id.edit_one); btn_add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SpannableString spanStr = new SpannableString("imge"); Drawable drawable = MainActivity.this.getResources().getDrawable(R.drawable.f045); drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight()); ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE); spanStr.setSpan(span,0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); int cursor = edit_one.getSelectionStart(); edit_one.getText().insert(cursor, spanStr); } }); } }
PS:对了安卓输入框为空,别忘了放图~
10.带删除按钮的EditText
我们经常在App的输入界面上看到:
当我们输入内容时,左侧会出现这样一个小叉子图标。我们点击之后,输入框的内容就会被清空!
实现起来似乎也很简单:
为EditText设置addTextChangedListener,然后在TextWatcher()中重绘比喻方法,用于窃听输入框的变化;然后 setCompoundDrawablesWithIntrinsicBounds 设置小叉子的图片;最后,重绘onTouchEvent方法,如果点击的区域是小叉叉图片的位置,清空文字!
实现代码如下:
public class EditTextWithDel extends EditText { private final static String TAG = "EditTextWithDel"; private Drawable imgInable; private Drawable imgAble; private Context mContext; public EditTextWithDel(Context context) { super(context); mContext = context; init(); } public EditTextWithDel(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public EditTextWithDel(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; init(); } private void init() { imgInable = mContext.getResources().getDrawable(R.drawable.delete_gray); addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { setDrawable(); } }); setDrawable(); } // 设置删除图片 private void setDrawable() { if (length() < 1) setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); else setCompoundDrawablesWithIntrinsicBounds(null, null, imgInable, null); } // 处理删除事件 @Override public boolean onTouchEvent(MotionEvent event) { if (imgInable != null && event.getAction() == MotionEvent.ACTION_UP) { int eventX = (int) event.getRawX(); int eventY = (int) event.getRawY(); Log.e(TAG, "eventX = " + eventX + "; eventY = " + eventY); Rect rect = new Rect(); getGlobalVisibleRect(rect); rect.left = rect.right - 100; if (rect.contains(eventX, eventY)) setText(""); } return super.onTouchEvent(event); } @Override protected void finalize() throws Throwable { super.finalize(); } }
本节总结:
本节介绍AndroidUI控件中的EditText(输入框)控件。有很多用途。事实上,以上情况肯定不能满足实际需要。在实际开发中,我们可能需要根据自己的需要自定义EditText!其实这涉及到自定义控件的中间话题。在进阶部分,我们将详细讲解Android中的自定义控件!我现在可以用了~