关于自己定义的多类型输入框,如何配合软键盘的显示

在做项目中的时候,需要制作类似聊天的界面,和微信聊天的界面差不多。但是在做底部的输入法的时候出现了困难。

如果讲图片等功能的选择放在输入框的上方,无法合理的利用输入法占用的区域,所以最终还是要向微信的方式靠拢。

里面出现了两个困难,第一个,如何获取输入法的高度。

查了很多,基本上都是使用的OnLayoutChangeListener来进行监听。

搞定了输入法的高度,又出现了相对布局在改变时,屏幕的闪屏现象。最终参考微信将其掩盖在输入法的动画中(其实就是视觉效果好,没有从本质上就行修改)。


界面如下:


关于自己定义的多类型输入框,如何配合软键盘的显示_第1张图片

关于自己定义的多类型输入框,如何配合软键盘的显示_第2张图片

好了不多说,直接上代码:

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。

当然,这个功能还有个缺陷没有时间去解决了,大家自己弄一下吧,点击按钮的时候。



你可能感兴趣的:(关于自己定义的多类型输入框,如何配合软键盘的显示)