0

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> 

回答

0

最後,我發現了一個棘手的實現它 首先,使對話片段高度匹配父 其次,在頂部添加的透明視圖的包裹元件的代碼視圖(高度等於工具欄)。所以,當鍵盤顯示時,對話框將被調整大小,但不會向上移動並重疊工具欄

0

只給我的想法。

你有沒有嘗試通過另一種佈局,如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