2012-12-19 87 views
4

我的問題類似於Full Screen DialogFragment in Android,但是這個問題並沒有完全解決我的問題。Android DialogFragment自動調整大小

我有一個DialogFragment,我想設置最大尺寸,並自動調整大小,如果DialogFragment延伸超過顯示的範圍。這似乎是應該被烘焙到操作系統中的東西,但我已經能夠提出的唯一解決方案是輪詢顯示尺寸,並在尺寸超出顯示範圍時手動調整尺寸。

DialogFragmentonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

// Display the first screen 
    m_rootView = inflater.inflate(R.layout.fragment_popup, container, false); 

    // Readjust the size of the dialog fragment if it is too large for the display 
    Globals.AdjustSizeOfDialogFragment(getActivity(), container); 

調整大小代碼Globals.java

// Adjusts the size of a dialog fragment's popup view to ensure that it fits within the display of the current device 
public static void AdjustSizeOfDialogFragment(final Activity parentActivity, final View popupRoot) 
{ 
    // If all of our function parameters are valid 
    if ((parentActivity != null) && (popupRoot != null)) 
    { 
     // If the dialog's root view has already rendered (has defined layout parameters) 
     if (popupRoot.getLayoutParams() != null) 
     { 
      // Resize the dialog now 
      ResizeDialogFragment(parentActivity, popupRoot); 
     } 
     // Else the view has not finished rendering yet 
     else 
     { 
      // Assign a listener to notify us when it has finished rendering 
      popupRoot.addOnLayoutChangeListener(new OnLayoutChangeListener() 
      { 
       public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) 
       { 
        // Remove the layout listener 
        v.removeOnLayoutChangeListener(this); 

        // Now we can render the dialog 
        ResizeDialogFragment(parentActivity, popupRoot); 
       } 
      }); 
     } 
    } 
} 

// Does the actual logic/math behind the AdjustSizeOfDialogFragment function 
private static void ResizeDialogFragment(Activity parentActivity, View popupRoot) 
{ 
    // Retrieves information about the display of the current device 
    DisplayMetrics    deviceDisplayMetrics = new DisplayMetrics(); 
    // Layout parameters that need to be applied to the popup's root view 
    LinearLayout.LayoutParams llParams    = null; 
    FrameLayout.LayoutParams flParams    = null; 

    // If all of our function parameters are valid 
    if ((parentActivity != null) && (popupRoot != null) && (popupRoot.getLayoutParams() != null)) 
    { 
     // Retrieve the layout parameters from the popup's root view and also get information on the current device's display 
     if (popupRoot.getLayoutParams() instanceof LinearLayout.LayoutParams) 
     { 
      llParams = (LinearLayout.LayoutParams) popupRoot.getLayoutParams(); 
     } 
     else if (popupRoot.getLayoutParams() instanceof FrameLayout.LayoutParams) 
     { 
      flParams = (FrameLayout.LayoutParams) popupRoot.getLayoutParams(); 
     } 
     parentActivity.getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics); 

     // If either the height or width of the popup view is greater then the height or width 
     // of the current display, clip them to approximately 90% of the display's width/height. 
     if (llParams != null) 
     { 
      if (llParams.width > deviceDisplayMetrics.widthPixels) 
      { 
       llParams.width = (int) (deviceDisplayMetrics.widthPixels * 0.9); 
      } 
      if (llParams.height > deviceDisplayMetrics.heightPixels) 
      { 
       llParams.height = (int) (deviceDisplayMetrics.heightPixels * 0.9); 
      } 
     } 
     else if (flParams != null) 
     { 
      if (flParams.width > deviceDisplayMetrics.widthPixels) 
      { 
       flParams.width = (int) (deviceDisplayMetrics.widthPixels * 0.9); 
      } 
      if (flParams.height > deviceDisplayMetrics.heightPixels) 
      { 
       flParams.height = (int) (deviceDisplayMetrics.heightPixels * 0.9); 
      } 
     } 
    } 
} 

的問題是:什麼是真正的Android的方式來做到這一點?這是我唯一的選擇嗎?這似乎是應該構建到操作系統中的東西,但我沒有問過任何人能夠找到它。

回答