键盘显示时禁用对话框片段

问题描述:

enter image description here键盘显示时禁用对话框片段

粉红色的是DialogFragment。当键盘显示时,它正在上升并重叠工具栏。我怎样才能使对话框片段保持不变,只有edittext上升。

我用SOFT_INPUT_ADJUST_PAN或SOFT_INPUT_ADJUST_RESIZE但仍然片段上去

SOFT_INPUT_ADJUST_NOTHING:对话框和编辑文本保持不变,但我想编辑文本上去

任何帮助将不胜感激?

MainActivity.java:

public class HelloDialogFragment extends DialogFragment { 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.dialog_fragment, container, false); 
     return v; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Dialog dialog = getDialog(); 
     if (dialog != null && dialog.getWindow() != null) { 
      Window window = dialog.getWindow(); 
      TypedValue tv = new TypedValue(); 
      getContext().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true); 
      int actionBarHeight = getResources().getDimensionPixelSize(tv.resourceId); 
      int statusBarHeight = (int) getResources().getDimension(R.dimen.status_bar_height); 
      window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
      window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
      WindowManager.LayoutParams params = window.getAttributes(); 
      params.gravity = Gravity.LEFT | Gravity.TOP; 
      params.x = 200 + 2 * Utils.dpToPx(8); 
      params.y = statusBarHeight + actionBarHeight + Utils.dpToPx(8); 
      params.width = Utils.screenWidth()/3; 
      params.height = Utils.screenHeight() - statusBarHeight - actionBarHeight - 2 * Utils.dpToPx(8); 
      window.setAttributes(params); 
      dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 
     } 
    } 

    static class Utils { 

     public static int screenWidth() { 
      return Resources.getSystem().getDisplayMetrics().widthPixels; 
     } 

     public static int screenHeight() { 
      return Resources.getSystem().getDisplayMetrics().heightPixels; 
     } 

     public static int dpToPx(int dp) { 
      return (int) (dp * Resources.getSystem().getDisplayMetrics().density); 
     } 

    } 

} 

dialog_fragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#f2f" 
    android:orientation="vertical"> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="1"/> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#E8E8E8" 
     android:gravity="center_vertical" 
     android:orientation="horizontal"> 

     <EditText 
      android:id="@+id/chatEditText" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_margin="8dp" 
      android:layout_weight="1" 
      android:background="#fff" 
      android:hint="Enter" 
      android:padding="8dp" 
      android:textColor="#B0B0B0" 
      android:textDirection="locale"/> 

     <Button 
      android:id="@+id/sendButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="8dp" 
      android:background="@color/colorPrimary" 
      android:padding="8dp" 
      android:text="SEND" 
      android:textColor="#fff"/> 

    </LinearLayout> 

</LinearLayout> 

最后,我发现了一个棘手的实现它 首先,使对话片段高度匹配父 其次,在顶部添加的透明视图的包裹元件的代码视图(高度等于工具栏)。所以,当键盘显示时,对话框将被调整大小,但不会向上移动并重叠工具栏

只给我的想法。

你有没有尝试通过另一种布局,如FrameLayout然后设置paddingTop等于或大于ToolBar

大小设置根元素相等或更大的marginTop大包装的元素都在dialog_fragment.xml比尺寸大ToolBar

我不这样做会有帮助。

这里是由FrameLayout

<FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:android:paddingTop=toolBarSize/> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="#f2f" 
      android:orientation="vertical"> 

      <View 
       android:layout_width="0dp" 
       android:layout_height="0dp" 
       android:layout_weight="1"/> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="#E8E8E8" 
       android:gravity="center_vertical" 
       android:orientation="horizontal"> 

       <EditText 
        android:id="@+id/chatEditText" 
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_margin="8dp" 
        android:layout_weight="1" 
        android:background="#fff" 
        android:hint="Enter" 
        android:padding="8dp" 
        android:textColor="#B0B0B0" 
        android:textDirection="locale"/> 

       <Button 
        android:id="@+id/sendButton" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginRight="8dp" 
        android:background="@color/colorPrimary" 
        android:padding="8dp" 
        android:text="SEND" 
        android:textColor="#fff"/> 

      </LinearLayout> 

     </LinearLayout> 
    </FrameLayout> 
+0

感谢您的帮助,但它不起作用 – maphongba008

+0

如何使用'FrameLayout'封装所有布局并设置padding top然后设置'LayoutParams'这样 'window.setFlags(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);' –

+0

我的对话框必须具有固定的位置,宽度/高度,所以无论该亲本是的LinearLayout或的FrameLayout,这如果softInputMode是SOFT_INPUT_ADJUST_PAN或SOFT_INPUT_ADJUST_RESIZE – maphongba008