神刀安全网

Android的dialog不能横向铺满全屏问题

最近在做一个分享界面,效果如下。

Android的dialog不能横向铺满全屏问题
效果图.png

因为在很多地方都需要用到这个分享的功能,所以我想,把这个功能用一个自定义Dialog封装起来,并将分享的状态通过接口返回给调用者。功能实现比较简单,就不赘述了。此处主要为了写一下,在实现过程中遇到的坑:我发现即便将contentView的width属性设置成match_parent,当运行看效果时,也无法将Dialog横向铺满屏幕

问题原因

在纠结很久,排除布局文件的问题后。我发现Dialog是有默认样式的。这里贴出Dialog的构造方法以供参考。

Dialog(Context context, int theme, boolean createContextThemeWrapper) {         if (createContextThemeWrapper) {             if (theme == 0) {                 TypedValue outValue = new TypedValue();                 context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme,                         outValue, true);                 theme = outValue.resourceId;             }             mContext = new ContextThemeWrapper(context, theme);         } else {             mContext = context;         }          mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);         Window w = PolicyManager.makeNewWindow(mContext);         mWindow = w;         w.setCallback(this);         w.setOnWindowDismissedCallback(this);         w.setWindowManager(mWindowManager, null, null);         w.setGravity(Gravity.CENTER);         mListenersHandler = new ListenersHandler(this);     }

我们发现,Dialog默认是实现Theme.Dialog样式的,那我们看一下Theme.Dialog的样式。

<style name="Theme.Dialog">    <item name="windowFrame">@null</item>     <item name="windowTitleStyle">@style/DialogWindowTitle</item>     <item name="windowBackground">@drawable/panel_background</item>     <item name="windowIsFloating">true</item>     <item name="windowContentOverlay">@null</item>     <item name="windowAnimationStyle">@style/Animation.Dialog</item>     <item name="windowSoftInputMode">stateUnspecified|adjustPan</item>     <item name="windowCloseOnTouchOutside">@bool/config_closeDialogWhenTouchOutside</item>     <item name="windowActionModeOverlay">true</item>     <item name="colorBackgroundCacheHint">@null</item>     <item name="textAppearance">@style/TextAppearance</item>     <item name="textAppearanceInverse">@style/TextAppearance.Inverse</item>     <item name="textColorPrimary">@color/primary_text_dark</item>     <item name="textColorSecondary">@color/secondary_text_dark</item>     <item name="textColorTertiary">@color/tertiary_text_dark</item>     <item name="textColorPrimaryInverse">@color/primary_text_light</item>     <item name="textColorSecondaryInverse">@color/secondary_text_light</item>     <item name="textColorTertiaryInverse">@color/tertiary_text_light</item>     <item name="textColorPrimaryDisableOnly">@color/primary_text_dark_disable_only</item>     <item name="textColorPrimaryInverseDisableOnly">@color/primary_text_light_disable_only</item>     <item name="textColorPrimaryNoDisable">@color/primary_text_dark_nodisable</item>     <item name="textColorSecondaryNoDisable">@color/secondary_text_dark_nodisable</item>     <item name="textColorPrimaryInverseNoDisable">@color/primary_text_light_nodisable</item>     <item name="textColorSecondaryInverseNoDisable">@color/secondary_text_light_nodisable</item>     <item name="textColorHint">@color/hint_foreground_dark</item>     <item name="textColorHintInverse">@color/hint_foreground_light</item>     <item name="textColorSearchUrl">@color/search_url_text</item>     <item name="textAppearanceLarge">@style/TextAppearance.Large</item>     <item name="textAppearanceMedium">@style/TextAppearance.Medium</item>     <item name="textAppearanceSmall">@style/TextAppearance.Small</item>     <item name="textAppearanceLargeInverse">@style/TextAppearance.Large.Inverse</item>     <item name="textAppearanceMediumInverse">@style/TextAppearance.Medium.Inverse</item>     <item name="textAppearanceSmallInverse">@style/TextAppearance.Small.Inverse</item>     <item name="listPreferredItemPaddingLeft">10dip</item>     <item name="listPreferredItemPaddingRight">10dip</item>     <item name="listPreferredItemPaddingStart">10dip</item>     <item name="listPreferredItemPaddingEnd">10dip</item>     <item name="preferencePanelStyle">@style/PreferencePanel.Dialog</item>  </style>

此时,问题就一目了然了。

解决方案

我发现很多人都遇到了相同的问题,当然也有相应的解决方案。为了不重复的制造轮子,在此引入一个连接。
解决方案

经过测试,该问中的解决方案还是很全面的。我采用了最后一种解决方式。设置Dialog的conentView的最小宽度属性。部分代码如下:

mContainerView = getLayoutInflater().inflate(R.layout.widget_yuedudialog, null); mContainerView.setMinimumWidth(10000); mDialog.setContentView(mContainerView);

至此,问题已经解决。但是为何可以这样解决,我还没有整理清楚。等有时间我会继续跟踪这个问题的。希望此篇文章能帮到大家一些什么。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Android的dialog不能横向铺满全屏问题

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址