前一段实现做App时遇到这么一个需求:这个一个商品评论列表,列表下面是一个输入框(默认评论商品)。如果你点击某一条评论,那么输入框就变成评论那条评论。(评论商品 还是 评论评论,我们称之为我们评论的状态)这是一个困扰众多android开发者的问题:通过程序无法直接获取到软键盘右上角的隐藏键,那么就很难通过软键盘的显示和隐藏来判断你评论的“状态”了。那么,该怎么解决?
我们发现,软键盘显示的时候,整个最外部layout的大小是变化了的(因为软键盘需要占据一定的屏幕空间)。那么我们是否可以根据最外部layout的“变大”,“变小”来判断软键盘的显示和隐藏了。具体要怎么做呢?
问题结局的突破点在最外部的layout,所以我们自定义一个layout继承我们最外部的layout(我这里是FrameLayout),并在里面定义一个接口供我们使用不就可以了吗,具体代码如下(XML代码不再演示,就是最外面的layout用com.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.this, msgs));
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 = 1;BIGGER = 10;等,这样省的混乱。