2012-12-19 10 views
4

Ma question est similaire à Full Screen DialogFragment in Android, mais cette question ne résout pas tout à fait mon problème.Android DialogFragment Redimensionnement automatique

J'ai un DialogFragment que je voudrais définir les dimensions maximales, et redimensionner automatiquement si le DialogFragment dépasse les limites de l'affichage. Cela semble être quelque chose qui devrait être cuit dans le système d'exploitation, mais la seule solution que j'ai pu trouver est d'interroger les dimensions d'affichage et de redimensionner manuellement si les dimensions dépassent les limites de l'affichage.

Dans le onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) de DialogFragment:

// 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); 

Code Redimensionnement à 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); 
      } 
     } 
    } 
} 

La question est: Quelle est la vraie façon Android pour le faire? Est-ce ma seule option? Cela semble être quelque chose qui devrait être intégré dans le système d'exploitation, mais personne que j'ai demandé n'a été capable de le trouver.

Répondre

0

Peut-être que vous avez ce problème parce que les fenêtres est de réglage sur votre DialogFragment afficher, donc si définissez la propriété windowSoftInputMode-adjustNothing dans le AndroidManifest.xml de l'activité affichée, pourrait résoudre votre problème.

<activity 
    ... 
    android:windowSoftInputMode="adjustNothing"> 
... 

Pour votre information: https://developer.android.com/training/keyboard-input/visibility.html#ShowOnStart

Questions connexes