android activty 伪弹框学习笔记

实现:
1、新建Activity

public class NoticeDialogActivtiy extends Activity{

    public static  String Tag_TOPMOSTNOTICES ="topmostnotices";

    private DialogViewPager viewPager;
    private CirclePageIndicator indicator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_noticedialog);
        getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);//需要放在setcontentview后
    }


}

注意:
需要添加

getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);

且要放在 setcontentview 后边

2、在styles.xml 中自定义主题 theme,MyDialogStyle

    <style name="MyDialogStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item><!-- 边框 -->
        <item name="android:windowNoTitle">true</item><!-- 无标题 -->
        <item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">false</item><!-- 半透明 -->
        <item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->
        <item name="android:windowBackground">@color/transparent</item> <!-- 背景透明 -->

    </style>

3、在AndroidManifest.xml 文件中添加

<activity android:name=".ui.NoticeDialogActivtiy" android:theme="@style/MyDialogStyle"/>

即可实现

以下为透明全屏无标题样式

<activity android:name=".ui.TestActivtiy" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>

问题记录

问题1、嵌套viewpager时的Activity无法全屏问题
布局如下xml所描述,但出来的效果却是 viewpager的宽度跟随 textview来变化

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:orientation="vertical"
           android:layout_width="match_parent"
           android:layout_height="match_parent" >
    <TextView
        android:id="@+id/tv_testtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="弹框测试"
        android:textSize="22sp"
        android:layout_gravity="center"
        />

    <net.xtion.crm.widget.dialogviewpager.DialogViewPager
        android:id="@+id/dialogviewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

如下图:可以看到viewpager的宽度是与“弹框测试” 宽度相同

这里写图片描述

原因猜测:
可能是因为这个Activity采用的主题是 自定义主题,而主题中使用的Dialog样式,因为是居中且只占用一定的宽度而非全屏

在Manifest 文件中
<activity android:name=".ui.TestActivtiy" android:theme="@style/MyDialogStyle"/>
自定义theme 中采用了 Animation.Dialog
<style name="MyDialogStyle">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowNoTitle">true</item>
</style>

实际验证:
经过验证发现也不是Dialog的问题,就算是把android:windowAnimationStyle 不设置为Dialog 也仍然是无法全屏

最终问题解决方法:
在setContentView 后添加一句:

setContentView(R.layout.activity_test);
getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

问题2:想要保留标题栏 ,但在style中当 <item name="android:windowNoTitle">false</item> 设置为false时会报错。
android java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layout

自定义样式如下:

<style name="MyDialogStyle"  >
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowNoTitle">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowAnimationStyle">@null</item>
</style>

解决:
在style中添加 parent="@android:style/Theme.Dialog"
eg:

<style name="MyDialogStyle"  parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:backgroundDimEnabled">true</item>
    <item name="android:windowNoTitle">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowAnimationStyle">@null</item>
</style>

解决原因猜测:因为 Dialog样式本就是有标题栏的,因而parent 为Diaglog theme的时候会继承父属性。实际上,当使用了 Dialog 父属性的时候,这时去掉<item name="android:windowNoTitle">false</item> 也是可以的 ,可能因为父属性已默认为有无标题。设置为true时则可以实现去标题栏效果

补充:透明度和背景颜色 调节
<item name="android:windowBackground">@android:color/transparent</item>
以上这句是必要的,如果去掉则会产生 类似于 Dialog 的效果,会有明显的中间内容与主题的边界。 transparent 实际上是背景颜色和透明度的控制,如果自带的不满意可使用自定义的颜色

问题3:添加 viewpagerIndicator时 ,可能会出现 layout_marginbottom 无效
如下图所示:
这里写图片描述

原因分析:应该是 自定义的theme 的影响,应用以下的theme 时则可以使 layout_marginbottom 的使用效果正常

    <style name="MyDialogStyle"  parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item> <!-- 必要存在-透明无黑框 -->
        <item name="android:windowFrame">@null</item> <!-- 边框 -->
        <item name="android:windowIsFloating">true</item> <!-- 是否浮现在activity之上 -->
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item> <!-- 模糊 -->
        <item name="android:windowNoTitle">false</item> <!-- 无标题 -->
    </style>

影响因素为 : android:windowNoTitle 设置为 false
更改后的效果为:
这里写图片描述
但在左上角 会显示 appname,即自定义的app 的名字

另外:如果 layout_marginbottom 失效的时候也可以使用 paddingbottom替代
参考资料:
1、Android系统自带样式(android:theme):
http://www.cnblogs.com/bluestorm/archive/2012/07/12/2588724.html
2、Android设置透明属性总结 http://blog.csdn.net/fancylovejava/article/details/9836267

猜你喜欢

转载自blog.csdn.net/haha_zhan/article/details/52790104
今日推荐