2012-12-19 52 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的方式来做到这一点?这是我唯一的选择吗?这似乎是应该构建到操作系统中的东西,但我没有问过任何人能够找到它。

回答