实现:
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