在做项目中的时候,需要制作类似聊天的界面,和微信聊天的界面差不多。但是在做底部的输入法的时候出现了困难。
如果讲图片等功能的选择放在输入框的上方,无法合理的利用输入法占用的区域,所以最终还是要向微信的方式靠拢。
里面出现了两个困难,第一个,如何获取输入法的高度。
查了很多,基本上都是使用的OnLayoutChangeListener来进行监听。
搞定了输入法的高度,又出现了相对布局在改变时,屏幕的闪屏现象。最终参考微信将其掩盖在输入法的动画中(其实就是视觉效果好,没有从本质上就行修改)。
界面如下:
好了不多说,直接上代码:
package com.bear.softkeyboardlistener; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.animation.Animation; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.bear.bearbroadcastreceiver.R; /** * 软键盘控制 * @author Steven Jiang * */ public class MainActivity extends Activity implements OnLayoutChangeListener{ //Activity最外层的Layout视图 private View activityRootView; //屏幕高度 private int screenHeight = 0; //软件盘弹起后所占高度阀值 private int keyHeight = 0; // 测试的按钮组布局 private View testLayout; // 输入法的高度 private int softHeight = 0; // 输入法的按钮 private Button button; // 是否是由软键盘发起的操作 private boolean isSoftClick = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activityRootView = findViewById(R.id.root_layout); testLayout = findViewById(R.id.testlayout); //获取屏幕高度 screenHeight = this.getWindowManager().getDefaultDisplay().getHeight(); //阀值设置为屏幕高度的1/3 keyHeight = screenHeight/3; button = (Button) findViewById(R.id.testWitch); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if(!((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).isActive()){ // 点击此按钮时,没有打开输入法 if(softHeight>0){ RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)testLayout.getLayoutParams(); lp.height = softHeight; testLayout.setLayoutParams(lp); isSoftClick = true; return; } } isSoftClick = false; // 切换输入法的显示 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub return super.onKeyDown(keyCode, event); } @Override protected void onResume() { super.onResume(); //添加layout大小发生改变监听器 activityRootView.addOnLayoutChangeListener(this); } @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值 // System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom); // System.out.println(left + " " + top +" " + right + " " + bottom); //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起 if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){ // Toast.makeText(MainActivity3.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show(); RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)testLayout.getLayoutParams(); lp.height = 0; testLayout.setLayoutParams(lp); softHeight = oldBottom - bottom; isSoftClick = true; }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){ // Toast.makeText(MainActivity3.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show(); if(isSoftClick){ // 是软键盘发起的消失 //设置底部高度 System.out.println(" 是软键盘发起的消失"); RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)testLayout.getLayoutParams(); lp.height = 0; testLayout.setLayoutParams(lp); isSoftClick = true; } else { System.out.println("按钮让软件盘消失"); //设置底部高度 RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)testLayout.getLayoutParams(); lp.height = softHeight; testLayout.setLayoutParams(lp); isSoftClick = true; } } } }
其中布局文件如下:
需要注意的是,要在配置文件中,对activity进行特殊属性的配置:
我的配置为:
关键是其中的adjustResize。
当然,这个功能还有个缺陷没有时间去解决了,大家自己弄一下吧,点击按钮的时候。