PID上指定Fragment中的EditText彈出軟鍵盤
阿新 • • 發佈:2018-11-10
效果圖:
首先 在AndroidManifest.xml中對Activity配置windowSoftInputMode 設定為adjustPan時彈出軟鍵盤會推動整個activity網上偏移,adjustResize則不會偏移 軟鍵盤會覆蓋在Activity上方都不是我們想要的效果。
思路:使用dialog來實現
1.右側輸入框使用TextView實現 點選時彈出dialog(背景全透明) ,在輸入時同步資料 也可以實現傳送等功能
2.listview在彈出軟鍵盤時需要獲取軟體盤的高度 來自動滾動listview到底部
關鍵程式碼如下:
public static Dialog createTransDialog(Context context, View view) {//建立dialog Dialog dialog = new Dialog(context, R.style.input_msg_dialog); dialog.setCanceledOnTouchOutside(false); //禁止外部點選取消 // dialog.setCancelable(false);//禁止返回鍵取消 --- 外部去設定 dialog.setContentView(view, new LinearLayout.LayoutParams (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); Window window = dialog.getWindow();//新增動畫 window.setWindowAnimations(R.style.dialog_anim_sytle_alpha); WindowManager.LayoutParams lp = window.getAttributes(); lp.width = ScreenCenter.getDisplayWidth(); dialog.getWindow().setAttributes(lp); return dialog; }
dialog透明度變化動畫<!--dialog樣式半透明--> <style name="dialog_tip" parent="android:style/Theme.Dialog"> <item name="android:background">#00000000</item> <!--背景顏色及和透明程度--> <item name="android:windowBackground">@android:color/transparent</item> <!--是否去除標題 --> <item name="android:windowNoTitle">true</item> <!--是否去除邊框--> <item name="android:windowFrame">@null</item> <!--是否浮現在activity之上--> <item name="android:windowIsFloating">true</item> </style> <!--dialog樣式全透明--> <style name="input_msg_dialog" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item><!--邊框--> <item name="android:windowIsFloating">true</item><!--是否浮現在activity之上--> <item name="android:windowIsTranslucent">false</item><!--半透明--> <item name="android:windowNoTitle">true</item><!--無標題--> <item name="android:windowBackground">@color/transparent</item><!--背景透明--> <item name="android:backgroundDimEnabled">false</item><!--模糊--> </style>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="0.9"
android:toAlpha="1"
android:duration="90"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="1"
android:toAlpha="0.9"
android:duration="90"/>
</set>
關鍵獲取軟鍵盤高度
兩種方法 (親測)
方法一:(在華為平板和定製PID上都可以獲取到準確高度值)
private boolean mIsSoftKeyboardPop = false;
private int mScreenHeight = 0;
private int mOldh = -1;
private int mNowh = -1; //高度
public SoftKeyboardSizeWatchLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
@Override
public void onGlobalLayout() {
Rect r = new Rect();
((Activity)(mContext)).getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
if(mScreenHeight == 0){
mScreenHeight = r.bottom;
}
mNowh = mScreenHeight - r.bottom;
if(mOldh != -1 && mNowh != mOldh) {
if (mNowh > 0) {
mIsSoftKeyboardPop = true; //顯示
} else {
mIsSoftKeyboardPop = false; //隱藏
}
}
mOldh = mNowh;
}
});
}
方法二 通過反射獲取:(在華為PID可以準確獲取值 在定製PID上獲取比實際值大)
public static int keyboardHeight = 0;
boolean isVisiableForLast = false;
ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = null;
public void addOnSoftKeyBoardVisibleListener() {
final View decorView = getWindow().getDecorView();
onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
//計算出可見螢幕的高度
int displayHight = rect.bottom - rect.top;
//獲得螢幕整體的高度
int hight = decorView.getHeight();
boolean visible = (double) displayHight / hight < 0.8;
int statusBarHeight = 0;
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = getContext().getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
if(visible&&visible!= isVisiableForLast){
//獲得鍵盤高度
keyboardHeight = hight - displayHight-statusBarHeight;
}
isVisiableForLast = visible;
}
};
decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
}
在顯示的時候可以listview下發設定一個view來動態改變他高度跟軟鍵盤高度一致推動listview網上移動,然後通過listview的setSelection來選中最後一個item滑動到底部 最後一個item可以用adapter.getcount()-1來獲取。
動態設定listview的高度(未測)
//滑動時可以做適當的延時,不然會出現沒有滑動到最底部的情況出現
new Handler(getActivity().getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
scrollToPosition(mAdapter.getCount()-1);
}
},300);