Android DialogFragment automatically resizing
My question is similar to Full Screen DialogFragment in Android, but this problem doesn’t completely solve my problem.
I have a DialogFragment and
I want to set the maximum size for it and automatically resize when the DialogFragment
goes out of the display range. This seems like it should fit into the OS, but the only solution I can think of is to poll the display size and manually resize it when the size goes out of the display range.
在 DialogFragment
的 onCreateView(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);
Adjust the code in 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);
}
}
}
}
The question is: what is the real Android method? Is this my only option? This seems to be built into the operating system, but none of the people I’ve asked have found it.
Solution
Perhaps you are experiencing this problem because Windows is adjusting the display of your DialogFragment, so if you set the windowSoftInputMode
property to adjustNothing
> display in AndroidManifest.xml
activity, which can solve your problem.
<activity
...
android:windowSoftInputMode="adjustNothing">
...
FYI: https://developer.android.com/training/keyboard-input/visibility.html#ShowOnStart