注释:
原理就是根据当前布局所占屏幕总高度减去当前布局可视高度,一般刚进入Activity,这两个高度相差不多,数值必定小于100,当软键盘出现时,当前布局的可视高度会受到挤压,两者相减大于100(软键盘一般大小差不多为总屏幕的4分之一,100是比较合适的数值)
但是有个问题就是,如果当前页面可以滚动,在软键盘消失后进行滚动,会重新计算当前布局可视高度,默认为初始可视高度的值,如上的方法会连续闪现隐藏和show两种不同状态,可通过判断只有走过show方法,才判断hide方法为有效,可完美规避此类问题。
另外如果在fragment里需要对软键盘消失监控,可通过在Activity里对hide和show的状态发广播,然后在需要的地方进行接收处理
1、配置文件中添加
<activity android:name="com.resmanager.client.user.LoginActivity" android:windowSoftInputMode="adjustResize" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar" > </activity>
2、Activity中
//该Activity的最外层Layout
final LinearLayout father = (LinearLayout) findViewById(R.id.father);// private LinearLayout activityRootView; //给该layout设置监听,监听其布局发生变化事件 father.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //比较Activity根布局与当前布局的大小 int heightDiff = father.getRootView().getHeight() - father.getHeight(); if (heightDiff > dpToPx(LoginActivity.this, 200)) { // if more than 200 dp, it's probably a keyboard... // ... do something here Log.d("TAG","aaaa");//显示 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp.setMargins(0, 0, 0, 0);//left top right button up.setLayoutParams(lp); uptwo.setLayoutParams(lp); hidden.setVisibility(View.GONE);//上面代码等价于:
//:layout_marginTop="0dip"
}else { Log.d("TAG","bbbb");//消失 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp.setMargins(0,45, 0, 0);//left top right button up.setLayoutParams(lp); lp.setMargins(0, 50, 0, 0); uptwo.setLayoutParams(lp); hidden.setVisibility(View.VISIBLE); } } }); public static float dpToPx(Context context, float valueInDp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); }3、Layout中
<LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:id="@+id/father" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical" android:layout_weight="12">
4、软键盘出现后,即使没操作也默认会把原来Activity的布局给顶上去了,感觉没必要的话,可以配置文件中更改
:windowSoftInputMode="adjustPan|stateHidden"
user_account_edit.setOnFocusChangeListener(new android.view.View. OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // 此处为得到焦点时的处理内容 } else { // 此处为失去焦点时的处理内容 } } });
1、定义LayoutParams
1 | LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //定义一个LayoutParams |
2、在LayoutParams中设置marginLeft
1 | layoutParams.setMargins( 20 , 0 , 0 , 0 ); //4个参数按顺序分别是左上右下 |
3、把这个LayoutParams设置给控件
1 | mView.setLayoutParams(layoutParams); //mView是控件 |