Android软键盘使用

本文详细介绍了Android中IMEOptions属性的使用方法,包括不同按钮的功能与代码实现,以及如何通过windowSoftInputMode调整软键盘弹出模式。同时,提供了解决ListView高度异常和控件随软键盘移动的方案。

imeOptions属性

​ 点击编辑框,软键盘右下角有不同的图标

常用属性说明
actionUnspecified切换到下一项按钮(默认)
actionNone同上
actionGoGO按钮
actionSearch搜索按钮
actionSend发送按钮
actionNext下一个按钮
actionDone完成按钮

使用

1  //singleLine和inputType属性至少设置一个,imeOptions才能起作用
<EditText
	android:id="@+id/editText"
	android:layout_width="200dp"
	android:layout_height="wrap_content"
	android:imeOptions="actionSearch"
	android:singleLine="true"
	android:inputType="text"/>
//以上属性也可在代码中设置
editText.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
editText.setInputType(EditorInfo.TYPE_CLASS_TEXT);
editText.setSingleLine(true);
2  //设置监听
EditText editText = (EditText) contentView.findViewById(R.id.editText);
editText.setOnEditorActionListener(new OnEditorActionListener() {
	@Override public boolean onEditorAction(TextView v, int actionId,KeyEvent event) {
		if (actionId == EditorInfo.IME_ACTION_SEARCH) {
			...	//点击软键盘上搜索按钮后的处理逻辑
			return true;	//类似拦截事件
		}
		return false;
	}
});

软键盘弹出模式

windowSoftInputMode弹出设置

属性说明
adjustNothing不调整,直接覆盖
adjustPan如果焦点位置距离屏幕底部距离小于软键盘高度,则把整个布局顶上去到焦点位置,不压缩多余空间,否则同adjustNothing
adjustResize运行调整窗口大小,以便输入方法不会覆盖其内容
adjustUnspecified由系统决定(默认配置)

windowSoftInputMode显示方式

属性说明
stateAlwaysHidden即使EditText获取焦点依旧隐藏
stateAlwaysVisible打开页面立即显示
stateHidden默认隐藏,EditText获取焦点才显示
stateUnchanged
stateUnspecified
stateVisible

使用

//AndroidMainfest.xml中的Activity标签下配置
android:windowSoftInputMode ="stateHidden | adjustResize">
//java中配置
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

问题

如何解决ListView高度小于0时出现的UI问题
​ 解决方法:如果高度小于等于0,那么将ListView设定为不可见

public class TxrjListView extends ListView { 
    public int count = 0;
    public TxrjListView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    }
    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh{ 
        super.onSizeChanged(w, h, oldw, oldh); 
        Log.e("txrjsms " + count++, "=>TxrjListView.onSizeChanged called! w=" + w + ",h=" + h + ",oldw=" + oldw + ",oldh=" + oldh);
         // 高度小于等于0不可见,高度大于0可见。 
        setVisibility(h <= 0 ? View.INVISIBLE : View.VISIBLE); 
    } 
}

底部控件或其他自定义控件随着软键盘的弹出,被顶上去

解决方案

//方法一,设置windowSoftInputMode属性
android:windowSoftInputMode="adjustResize|stateHidden" 
//方法二,动态设置控件高度
//rootView为RelativeLayout子类,button等LinearLayout子类,直接设置可能会报类型转换错误。解决方法:给button等控件包裹一层RelativeLayout,其他情况同理
rootView = (RelativeLayout) getView().findViewById(R.id.root_view);
rootView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
	@Override
	public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
		if (bottom - oldBottom < -1) {
			//软键盘弹上去了,动态设置高度为0
			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,0);
			params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
			liBottom.setLayoutParams(params);
		} else if (bottom - oldBottom > 1) {
			//软键盘弹下去了,恢复原先控件高度
             //如关闭软键盘,按钮消失。可自定义hanlder,延时设置按钮高度
			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, (int) DpPxUtil.dp2px(context, bottomHight)); 
			params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
			liBottom.setLayoutParams(params); 
		}
	}
});

点击EditText 不让其弹出键盘

mEditText.setInputType(InputType.TYPE_NULL);  //不让其获取焦点

自定义软键盘

待更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值