Android UI之EditText注意点收集

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=)]

6.4 参考链接

Android各种键盘挡住输入框解决办法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值