Android-根据软键盘的显示与隐藏改变输入框的内容

前一段实现做App时遇到这么一个需求:这个一个商品评论列表,列表下面是一个输入框(默认评论商品)。如果你点击某一条评论,那么输入框就变成评论那条评论。(评论商品 还是 评论评论,我们称之为我们评论的状态)这是一个困扰众多android开发者的问题:通过程序无法直接获取到软键盘右上角的隐藏键,那么就很难通过软键盘的显示和隐藏来判断你评论的“状态”了。那么,该怎么解决?

我们发现,软键盘显示的时候,整个最外部layout的大小是变化了的(因为软键盘需要占据一定的屏幕空间)。那么我们是否可以根据最外部layout的“变大”,“变小”来判断软键盘的显示和隐藏了。具体要怎么做呢?

问题结局的突破点在最外部的layout,所以我们自定义一个layout继承我们最外部的layout(我这里是FrameLayout),并在里面定义一个接口供我们使用不就可以了吗,具体代码如下(XML代码不再演示,就是最外面的layoutcom.example.........ResizeLayout):

自定义ResizeLayout

public class ResizeLayout extends FrameLayout {

private OnResizeListener mListener;

 

public ResizeLayout(Context context, AttributeSet attrs) {

super(context, attrs);

}

 

//定义的接口,我们需要在对应的activity里引用该接口,并把对应控件进行接口设置, //即调用下面的setOnResizeListener方法。

public interface OnResizeListener {

void OnResize(int w, int h, int oldw, int oldh);

}

 

public void setOnResizeListener(OnResizeListener rl) {

mListener = rl;

}

 

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

 

if (mListener != null) {

mListener.OnResize(w, h, oldw, oldh);

}

}

}

Activity中的做法:

public class ItemDetailActivity extends BaseActivity implements OnResizeListener{

private ResizeLayout resizeLayout_itemdetail;

 

OnCreate方法:

resizeLayout_itemdetail=(ResizeLayout)findViewById(R.id.resizeLayout_itemdetail);

resizeLayout_itemdetail.setOnResizeListener(this);

mHandler = new MyHandler();

 

//实现OnResize方法

@Override

public void OnResize(int w, int h, int oldw, int oldh) {

int change = BIGGER;

    if (h < oldh) {

    change = SMALLER;

}

mHandler.sendEmptyMessage(change);//做你要做的事情

}

 

//mHandler是什么

Public static MyHandler mHandler;

class MyHandler extends Handler {

 

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what) {

case 0:

dataListView.setAdapter(new CommentListAdapter(

ItemDetailActivity.thismsgs));

dataListView.setListViewHeightBasedOnChildren();

break;

 

case 1:

new SetDataListThread().start();

break;

case BIGGER:

//makeToast("变大");

refId = "";

et_comment.setHint("发表评论(回车发送)");

refcontent = "";

break;

case SMALLER:

//makeToast("变小");

break;

case 22:

setdrawable();

break;

 

default:

break;

}

}

};

}

 

 

注:大家在重写Handler时,处理消息对应的msg.what,最好别用case 1,case 2等,应该在开头把对应的操作定义好,比如:REFRESH = 1BIGGER = 10;等,这样省的混乱。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值