作者:Cher麻花 | 来源:互联网 | 2023-05-19 01:45
自定义的输入框一般都有输入法与表情面板切换的功能,要做到美好的切换体验也是不容易的。切换时不要闪,闪的原因是输入法出现时,会把activity往上挤压,输入法隐藏时,activity又会复原,这个过程
自定义的输入框一般都有输入法与表情面板切换的功能,要做到美好的切换体验也是不容易的。切换时不要闪,闪的原因是输入法出现时,会把activity往上挤压,输入法隐藏时,activity又会复原,这个过程,我们的界面就会跳来跳去,给人感觉就是闪瞎眼睛。
知道原因后就好解决了,首先给AndroidManifest.xml的activity设置:
android:windowSoftInputMode="stateHidden|adjustResize"
作用是打开activity时隐藏软键盘和自动改变activity大小以适应弹出的软键盘。
整体布局如下:
android:layout_
android:layout_
android:orientation="vertical">
android:layout_
android:layout_
android:background="#008800"
android:orientation="horizontal">
android:id="@+id/tv_emoji"
android:layout_
android:layout_
android:padding="10dp"
android:text="\@"
android:textSize="20sp"
android:text/>
android:id="@+id/et_input"
android:layout_
android:layout_ />
显示未@的TextView就是输入法和表情面板的切换按钮。
一、点击切换按钮,弹出软键盘
固定输入框以上内容的高度,它的高度固定之后,自定义输入框的位置就固定了,它就不会跳来跳去了,同时设置表情面板高度为0.
二、点击切换按钮,关闭软键盘
原理和上面一样,不同是需要设置表情面板的高度,并且它的高度和软键盘的高度一致。
MainActivity代码:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_emoji:
int softHeight = KeyBoardUtil.getSoftBoardHeight(this);
if (softHeight <= 0) {
softHeight = KeyBoardUtil.getSoftBoardHeightSP(this);
} else {
KeyBoardUtil.setSoftBoardHeight(this, softHeight);
}
KeyBoardUtil.setSoftBoardHeight(this, softHeight);
if(KeyBoardUtil.isShowSoftBoard(this)) {
lockHeight();
setEmojiViewHeight(softHeight);
KeyBoardUtil.closeKeyboard(inputEditText, this);
unlockHeight();
} else {
lockHeight();
setEmojiViewHeight(0);
KeyBoardUtil.openKeyboard(inputEditText, this);
unlockHeight();
}
break;
}
}
private void lockHeight() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) showFrameLayout.getLayoutParams();
lp.height = showFrameLayout.getHeight();
lp.weight = 0;
showFrameLayout.setLayoutParams(lp);
}
private void unlockHeight() {
// 需要做一个延时操作,不然没有效果
inputEditText.postDelayed(new Runnable() {
@Override
public void run() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) showFrameLayout.getLayoutParams();
lp.weight = 1;
showFrameLayout.setLayoutParams(lp);
}
}, 200);
}
private void setEmojiViewHeight(int h) {
ViewGroup.LayoutParams lp = emojiFrameLayout.getLayoutParams();
lp.height = h;
emojiFrameLayout.setLayoutParams(lp);
}
软键盘工具类代码:
public class KeyBoardUtil {
public static final String SP_SOFTBOARD_HEIGHT = "sp_softboard_height";
/**
* 软键盘是否显示
*
* @param activity
* @return
*/
public static boolean isShowSoftBoard(Activity activity) {
return getSoftBoardHeight(activity) > 100;
}
/**
* 软键盘高度
*
* @param activity
* @return
*/
public static int getSoftBoardHeight(Activity activity) {
Rect r = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
return getScreenHeight(activity) - r.bottom;
}
/**
* 获取屏幕高度
*
* @param activity
* @return
*/
private static int getScreenHeight(Activity activity) {
WindowManager wm = activity.getWindowManager();
return wm.getDefaultDisplay().getHeight();
}
/**
* 获取软键盘高度
*
* @param context
* @return
*/
public static int getSoftBoardHeightSP(Context context) {
SharedPreferences sp = context.getSharedPreferences("user", Context.MODE_PRIVATE);
return sp.getInt(SP_SOFTBOARD_HEIGHT, 400);
}
/**
* 设置软键盘高度
*
* @param context
* @param h
*/
public static void setSoftBoardHeight(Context context, int h) {
SharedPreferences sp = context.getSharedPreferences("user", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putInt(SP_SOFTBOARD_HEIGHT, h);
editor.apply();
}
/**
* 打开软键盘
*
* @param mEditText 输入框
* @param mContext 上下文
*/
public static void openKeyboard(EditText mEditText, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.SHOW_FORCED);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* 关闭软键盘
*
* @param mEditText 输入框
* @param mContext 上下文
*/
public static void closeKeyboard(EditText mEditText, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
}
效果图:
打开软键盘
关闭软键盘
demo代码下载:
http://download.csdn.net/detail/yu75567218/9629656
参考:
http://blog.csdn.net/javazejian/article/details/52126391
http://blog.163.com/ittfxin@126/blog/static/110674863201572513818601/