一,首先为了保证不被键盘顶上去,需要在Manifest中设置定义的FragmentActivity属性
android:windowSoftInputMode="stateHidden|adjustPan",这样会保证底部栏保持不变。
这个是我自己的FragmentActivity
<activity
android:name=".MainIndex"
android:label="@string/app_name"
android:windowSoftInputMode="stateHidden|adjustPan"
android:configChanges="keyboard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
二,如果是将需要输入EditText的布局写在当前的frgment中,就会出现问题,虽然设置了android:windowSoftInputMode,但是当键盘消失时,底部栏还是能够明显的看到高度变化了。
因此,个人建议将输入的布局写成PopupWindow的形式,从屏幕底部弹出来,然后键盘会将PopupWindow顶上去,不会影响到fragment的布局。
以下是输入布局实现
xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/message_replytop"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_above="@id/message_reply" />
<LinearLayout
android:id="@+id/message_reply"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#ffffff"
android:orientation="horizontal" >
//此处的EditTextSpuer下面会提到
<com.app.function.EditTextSpuer
android:id="@+id/message_replybox_edit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_weight="7"
android:maxLines="3"
android:background="@drawable/comment_shape"
android:textColor="#646c78"
android:textSize="18sp" />
<TextView
android:id="@+id/message_replybox_send"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_gravity="center"
android:layout_marginBottom="5dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:layout_weight="1"
android:background="@drawable/comment_sendbg"
android:gravity="center"
android:text="确定"
android:textSize="20sp"
android:textColor="@color/white" />
LinearLayout>
RelativeLayout>
三,接下来就需要在fragment中设置PopupWindow的弹出事件。
以下是本人实现的代码
public void ReplyBox() {
final View view = View.inflate(getActivity(),
R.layout.message_replybox, null);
comment_edit = (EditTextSpuer) view.findViewById(R.id.message_replybox_edit);
send = (TextView) view.findViewById(R.id.message_replybox_send);
TextView dismiss = (TextView) view.findViewById(R.id.message_replytop);
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (TextUtils.isEmpty(comment_edit.getText().toString().trim())) {
Toast.makeText(getActivity(), "请填写回复内容", Toast.LENGTH_SHORT)
.show();
} else {
postMessage();
}
}
});
dismiss.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
InputMethodManager imm = (InputMethodManager) comment_edit
.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
mpopupWindow.dismiss();
}
});
view.startAnimation(AnimationUtils.loadAnimation(getActivity(),
R.anim.fade_in));
if (mpopupWindow == null) {
mpopupWindow = new PopupWindow(getActivity());
mpopupWindow.setWidth(LayoutParams.MATCH_PARENT);
mpopupWindow.setHeight(LayoutParams.WRAP_CONTENT);
mpopupWindow.setBackgroundDrawable(new ColorDrawable());
mpopupWindow.setFocusable(true);
mpopupWindow.setTouchable(true);
mpopupWindow.setOutsideTouchable(true);
mpopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
//这行代码非常关键,如果不加上,弹出的键盘会讲mpopupWindow的布局遮挡一部分,一定要加,切记切记。。。。。
mpopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
mpopupWindow.setContentView(view);
comment_edit.requestFocus();
comment_edit.setText("");
comment_edit.setHint(texthint);
comment_edit.setHintTextColor(getResources().getColor(R.color.hintcolor));
mpopupWindow.showAtLocation(mylistview, Gravity.BOTTOM, 0, 0);
mpopupWindow.update();
}
这里给大家一个弹出和隐藏软键盘的代码,非常实用。主要是要保持mpopupWindow和键盘同时出现和消失。
private void popupInputMethodWindow() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}, 0);
}
四,最后还会有个问题,当键盘弹出后,按下返回键,键盘会消失,但是输入布局不会消失,这里需要重写edittext,实现返回键的监听,本人试了很多方法,只用这个可以很方便的实现。
package com.app.function;
import com.app.fragment.FragmentMessage;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
public class EditTextSpuer extends EditText{
InputMethodManager imm;
public EditTextSpuer(Context context,AttributeSet attributeSet) {
super(context,attributeSet);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER ) {
Log.v("xpf","--------------------+onKeyDown---------enter");
return true;
}
return super.onKeyDown(keyCode, event);
}
public boolean onKeyPreIme (int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN ) {
//调用了fragment中的静态方法,关闭mpopupWindow和键盘,这里最为关键。
FragmentMessage.hiddenpopupWindow();
Log.v("xpf","--------------------+onKeyPreIme---------back");
return true;
}
return super.onKeyPreIme(keyCode, event);
}
}
public static void hiddenpopupWindow(){
if(mpopupWindow!=null&&mpopupWindow.isShowing()){
InputMethodManager imm = (InputMethodManager) comment_edit
.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(mpopupWindow
.getContentView().getWindowToken(), 0);
}
mpopupWindow.dismiss();
mpopupWindow=null;
}
}
以上,就可以很好的解决fragment中关于键盘弹出的各种问题,代码时本人亲自编写,经过实际验证,没有问题。以及让人头疼的返回键的监听的问题也可以一并解决。
希望对大家能有所帮助,也希望大家给予意见。