1. 程式人生 > >PID上指定Fragment中的EditText彈出軟鍵盤

PID上指定Fragment中的EditText彈出軟鍵盤

效果圖:


首先  在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樣式半透明-->
    <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>
dialog透明度變化動畫
<?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);