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

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

    原文作者:微行丶简
    原文地址: https://www.jianshu.com/p/a3e8580f9683
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞