1 布局要点
1.1 背景透明
EditText的background属性设置为@null:
android:background="@null"
1.2 不可编辑
android:inputType="none"
1.3 EditTex多行输入及输入置顶
android:minLines="3"
android:maxLines="3"
android:gravity="Top" // 即可实现内容置顶
1.4 EditText组件drawableLeft属性设置的图片和hint设置的文字之间的距离
<EditText
android:id="@+id/tel_num"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
// 以下两行,如上图,设置的就是之前的手机icon和”请输入手机号“之间的距离
// android:drawablePadding="8dp"
// android:drawableLeft="@drawable/phone"
android:drawablePadding="8dp"
android:drawableLeft="@drawable/phone"
android:hint="请输入手机号码"
/>
2 EditText弹出软键盘
2.1 默认不弹出软键盘方法
(1)在 AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为 adjustUnspecified|stateHidden
<activity android:name=".Main"
android:label="@string/app_name"
android:windowSoftInputMode="adjustUnspecified|stateHidden"
android:configChanges="orientation|keyboardHidden">
</activity>
备注:Activity一启动默认弹出输入法
android:windowSoftInputMode=”stateVisible|adjustPan”
(2)让EditText失去焦点,使用EditText的clearFocus方法
EditText edit=(EditText)findViewById(R.id.edit);
edit.clearFocus();
(3)强制隐藏Android输入法窗口
public class KeybordUtils {
/**
* 显示软键盘
*/
public static void openKeybord(View view, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* 关闭软键盘
*/
public static void closeKeybord(View view, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
(4)EditText始终不弹出软件键盘
EditText edit=(EditText)findViewById(R.id.edit);
edit.setInputType(InputType.TYPE_NULL);
3 获取焦点,显示光标
3.1 获取焦点
(1)代码
EditText mEditText = (EditText) findViewById(R.id.et);
mEditText.setFocusable(true);
mEditText.setFocusableInTouchMode(true);
(2)布局
android:focusable="true"
android:focusableInTouchMode="true"
(3)失去焦点
mEditText.clearFocus();
3.2 显示光标
(1)代码
mEditText.requestFocus();//获取焦点,光标出现
(2)布局(在EditText的父级控件上设置)
android:cursorVisible="true" //显示
android:cursorVisible="false" //隐藏
(3)设置光标颜色
android:textCursorDrawable="#ff2244"
3.3 监听EditText焦点变化 , 当获取焦点后 hasFocus 为true
mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// 获得焦点
} else {
// 失去焦点
}
}
});
4 Android软键盘的搜索按钮
4.1 如何设置软键盘显示搜索按钮?
android:imeOptions="actionSearch" // 在输入框中加入
4.2 如何监听搜索按钮?
mEditText.setOnEditorActionListener(newTextView.OnEditorActionListener(){
@Override
public booleanonEditorAction(TextView v, intactionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
// 先隐藏键盘
KeybordUtils.closeKeybord(mEditText,context);
String keyWord = mEditText.getText().toString().trim();
searchByKeyWord(keyWord);
return true;
}
return false;
}
});
4.3 如何解决软键盘会把原界面挤上去的问题?
// 在androidMainfest.xml文件中在此Activity中写入 android:windowSoftInputMode="adjustPan"
5 点击EditText文本框之外任何地方隐藏键盘
5.1 通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏
(1)父layout设置id和clickable=“true”
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/traceroute_rootview"// id
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" // clickable=true
android:orientation="vertical" >
</LinearLayout>
(2)在onCreate里,添加onClick事件的监听
findViewById(R.id.traceroute_rootview).setOnClickListener(this);
(3)在onClick中
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.traceroute_rootview:
KeybordUtils.closeKeybord(v,context);
break;
}
}
5.2 通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽
这种方法实现起来比较麻烦,解决思路与iOS中的事件分发机制是类似,对于处理隐藏事件比较清晰,通过层层事件分发,然后判断是否在需要屏蔽的区域。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
// 必不可少,否则所有的组件都不会有TouchEvent了
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = { 0, 0 };
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}
6 各种键盘挡住输入框解决办法
6.1 代码
在 AndroidManifest.xml 对应的Activity里添加:
<activity
Android:name=".activity.HomeActivity"
Android:windowSoftInputMode="adjustPan|stateHidden"/>
6.2 解释
(1)官方的解释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9SWK4Oe9-1609479174685)(http://cdn.img2.a-site.cn/pic.php?url=aHR0cDovL21tYml6LnFwaWMuY24vbW1iaXpfcG5nL3YxTGJQUFdpYVN0NlNTaWNma0NoRWpoZmlhdHg3OTU1alhqZU0zSE5oM2ZDdDFCaWEwY2ljclMyQ0pxaWE3cTZuSXRuUTlaMHJyYmxUNjRMQkxVd3lXMG9uaDdBLzA/d3hfZm10PXBuZw==)]
(2)对这两种属性使用场景、优缺点、注意事项进行了全方面总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r665KQMF-1609479174692)(http://cdn.img2.a-site.cn/pic.php?url=aHR0cDovL21tYml6LnFwaWMuY24vbW1iaXpfcG5nL3YxTGJQUFdpYVN0NlNTaWNma0NoRWpoZmlhdHg3OTU1alhqaG5xa0RUY2liS3k0N09MWGlic2FRa2RaQUJtT1ZLRTNZU3pLT3UyTmN6S0tob3YyOFJWSkpFbHcvMD93eF9mbXQ9cG5n)]
6.3 例子
(1)adjustPan
整个界面向上平移,使输入框露出,它不会改变界面的布局;界面整体可用高度还是屏幕高度,这个可以通过下面的截图看出,如点击 输入框6,输入框会被推到键盘上方,但 输入框1 被顶出去了,如果界面包含标题栏,也会被顶出去。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q92AvKEx-1609479174698)(http://cdn.img2.a-site.cn/pic.php?url=aHR0cDovL21tYml6LnFwaWMuY24vbW1iaXpfanBnL3YxTGJQUFdpYVN0NmJja3Z6TGVVaWFQRzFvZndrb2pDaERnUjdDcXBUMzBiSUladHI1RENpYkM4MnVsU2ljb3FObjZZWXplS2JxZXhVSjVZaWJ3UWNlbmlhMjFRLzA/d3hfZm10PWpwZWc=)]
(2)adjustResize
需要界面的高度是可变的,或者说 Activity 主窗口的尺寸是可以调整的,如果不能调整,则不会起作用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXaIkbTD-1609479174703)(http://cdn.img2.a-site.cn/pic.php?url=aHR0cDovL21tYml6LnFwaWMuY24vbW1iaXpfcG5nL3YxTGJQUFdpYVN0NlNTaWNma0NoRWpoZmlhdHg3OTU1alhqSE1HcG5xUEwzeWhHNGxpYjVuRkFNQ09DZmdibThwa25GSXFxbHk1YWJROUlFbkR5NXlzMUlzUS8wP3d4X2ZtdD1wbmc=)]