2016-06-10 89 views
1

我在顯示Fullscreen的自定義DialogFragment時遇到了一些問題。該對話框具有可滾動的內容並具有自動完成文本視圖。打開軟鍵盤時總是調整DialogFragment的大小

最初,對話框以頂部邊距顯示 - 以編程方式設置爲佈局內容頂部的透明視圖。一旦autocompletetextview被關注,這個邊界就會減少到0(這樣就會讓人覺得對話框變成了全屏模式)。此時鍵盤也顯示出來。

當前,鍵盤減小了對話框的大小,並且對話框中的按鈕在鍵盤上方向上移動。這就產生了一個問題,因爲一旦autocompletetextview失去焦點,對話框將被調整大小,並且由於鍵盤調整大小,還會創建一個閃爍: 它們的鍵盤被隱藏 - >對話框被移動到底部 - >對話框的大小調整到全屏 - >對話框resisez到初始大小

當前創建的對話框的:

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = super.onCreateDialog(savedInstanceState); 

     dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); 

     if (!hasTitle()) { 
      dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     } 

     // the content 
     //final RelativeLayout root = new RelativeLayout(getActivity()); 
     //root.setLayoutParams(
     //  new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     //dialog.setContentView(root); 

     if (position != null) { 
      WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes(); 
      windowParams.x = position.x; 
      windowParams.y = position.y; 
      dialog.getWindow().setAttributes(windowParams); 
     } else { 
      dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
     } 

     dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT)); 
     dialog.getWindow().setGravity(Gravity.TOP | Gravity.START); 

     return dialog; 
    } 

這工作部分,因爲對話未完全填滿寬度,它是小了很多。

東西確實解決這個問題,但它創建了另一個問題:

@Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_DeviceDefault_DialogWhenLarge_NoActionBar); 
    } 

但是,這會影響到對話框的背景怎麼樣子,我似乎無法能夠從對話框創建改變方法。

回答

3

我終於找到了解決我的問題。

對話框的創建:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog dialog = super.onCreateDialog(savedInstanceState); 

    if (!hasTitle()) { 
     dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    } 

    if (position != null) { 
     WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes(); 
     windowParams.x = position.x; 
     windowParams.y = position.y; 
     dialog.getWindow().setAttributes(windowParams); 
    } else { 
     WindowManager.LayoutParams attrs = dialog.getWindow().getAttributes(); 
     attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; 
     dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
    } 

    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT)); 
    dialog.getWindow().setGravity(Gravity.TOP | Gravity.START); 

    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);  

    return dialog; 
} 

片段的創建(我自定義對話框的風格 - 用它是非常重要的No_FRAME):

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // We customize the style of this dialog - we remove the frames of the dialogs and leave the drawing to the 
    // onCreateView() method, and we use the custom theme for dialogs - this is a special theme which has no 
    // Background and the status bar is left unchanged 
    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_Dialog); 
} 

自定義主題(我重用了我的所有樣式,以便對話框看起來一樣):

<!-- Custom theme for dialogs - this will use the same styling as the main theme, but will disable the background 
of the window, and it will also leave the status bar color unchanged --> 
<style name="Theme.Dialog"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <!-- We do not want to change the status bar color --> 
    <item name="colorPrimaryDark">@color/transparent</item> 
</style> 

現在我的對話框片段看起來像就像FullScreen一樣,打開軟鍵盤時不會調整大小,因此在手動更改大小時會產生閃爍效果。 重要的作品是DialogFragment.STYLE_NO_FRAME

我希望這可以幫助其他類似問題的人。

+1

DialogFragment.STYLE_NO_FRAME竅門! –

1

你可以做一件事這個...

在onViewCreated補充一點:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 
super.onViewCreated(view, savedInstanceState); 

}

使用 「adjustPan」 不調整大小活動的主窗口,以騰出空間對於軟鍵盤所以在這種情況下,您的分段頁面的所有視圖應該位於ScrollView中,否則用戶可能需要關閉軟鍵盤才能進入窗口的遮蔽部分並與其交互。

希望這會幫助你。

+0

這目前不適用於我的情況 –

+0

我已編輯我的答案..試試這個 –

+0

您編輯的答案是相同的,只是它以編程方式設置。如你所料,結果是一樣的。 –

相關問題