zoukankan      html  css  js  c++  java
  • Android中关于系统Dialog无法全屏的问题(dialog样式)

    自定义一个Dialog,继承了系统Dialog的样式。这时候会发现,即使布局文件中写的width和height都是match_parent,依然无法达到全屏的效果。

    原因是:系统dialog的样式。默认有padding=10dip,所以即使设置为全屏,也是有10dip的间隙。

    如果不得不继承这个样式,还希望改变这个dialog的大小,我们可以尝试重写一个这个Dialog的show()方法。

    分析:在Dialog的show()方法中,我们可以看到代码:

    复制代码
     1   WindowManager.LayoutParams l = mWindow.getAttributes();
     2         if ((l.softInputMode
     3                 & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
     4             WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
     5             nl.copyFrom(l);
     6             nl.softInputMode |=
     7                     WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
     8             l = nl;
     9         }
    10 
    11         try {
    12             mWindowManager.addView(mDecor, l);
    13             mShowing = true;
    14     
    15             sendShowMessage();
    16         } finally {
    17         }
    复制代码

    也就是说,大小其实是在show的时候控制的。我们在show之前,即使动态改变这个layoutParams,也是不起作用的。

    我是这么写的:

    复制代码
     1 @Override
     2     public void show() {
     3         super.show();
     4         //set the dialog fullscreen
     5         FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) mContentView
     6                 .getLayoutParams();
     7         layoutParams.width = display.getWidth();
     8         layoutParams.height = display.getHeight();
     9         mContentView.setLayoutParams(layoutParams); 
    10 }
    复制代码

    其中,mContentView是整个大布局的view。这样就达到了既继承系统Theme.Dialog样式,又全屏的目的了。

    当然,也有人提出,采用其他样式来避开这个问题,我尝试过,有些样式是可以全屏,但多了些我不想要的效果。这样来修改,也算一个解决方案吧。

    <!-- 全屏dialog样式 左右插入 -->

    <resources>
    
        <style name="AppTheme" parent="android:Theme.Black"/>
        <style name="processDialog" >
            <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上--> 
            <item name="android:windowFullscreen">true</item>  
            <item name="android:windowIsTranslucent">false</item><!--半透明-->  
            <item name="android:windowNoTitle">true</item><!--无标题-->  
            <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->  
            <item name="android:backgroundDimEnabled">true</item><!--模糊-->  
            <item name="android:backgroundDimAmount">0.5</item> 
            <item name="android:alpha">0.3</item> 
        </style>  
    
    </resources>

    实际适应

    <resources>
    
      
        <style name="processDialog" >
            
            <item name="android:windowFullscreen">true</item>  
             
            <item name="android:windowNoTitle">true</item><!--无标题-->  
           
           
        </style>  
    
    </resources>

    代码中加载这个view并把view set到dialog上,这样全屏的dialog就完成了

    mView = LayoutInflater.from(this).inflate(R.layout.process_dialog, null);  
        processDialog = new Dialog(LogActivity.this, R.style.processDialog);  
        processDialog.setCancelable(false);
        processDialog.setContentView(mView);  
            mAutoCloseDialog = new AutoCloseDialog(processDialog);
        mAutoCloseDialog.show(Prefs.DIALOG_DISPLAY_TIME);

    接下来用一个封装好的类,做一个延时关闭的效果

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    
    import android.app.Dialog;
    
    public class AutoCloseDialog{  
        
        private Dialog dialog;  
        private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();  
          
        public AutoCloseDialog(Dialog dialog){  
            this.dialog = dialog;  
        }  
          
        public void show(long duration){  
            
            Runnable runner = new Runnable() {  
                public void run() {  
                    dialog.dismiss();  
                }  
            };  
            executor.schedule(runner, duration, TimeUnit.MILLISECONDS);
            dialog.show();
        }  
          
    } 

     

     

     

     

    下面是创建Dialog的代码:

              Dialog dialog = new Dialog(Activity.this, R.style.mydialog);

              dialog.setContentView(R.layout.layout);

              LayoutParams lay = dialog.getWindow().getAttributes();

              setParams(lay);

              dialog.show();

     

     

    下面是设置Dialog的LayoutParams的属性方法:

    private void setParams(LayoutParams lay) {

      DisplayMetrics dm = new DisplayMetrics();

      getWindowManager().getDefaultDisplay().getMetrics(dm);

      Rect rect = new Rect();

      View view = getWindow().getDecorView();

      view.getWindowVisibleDisplayFrame(rect);

      lay.height = dm.heightPixels - rect.top;

      lay.width = dm.widthPixels;

     }

     http://www.cnblogs.com/lovejoy/p/3527935.html

    http://blog.csdn.net/cqupt_chen/article/details/8205055

    透明dialog样式

    <style name="MyDialogStyle">  
            <item name="android:windowBackground">@android:color/transparent</item>  
            <item name="android:windowFrame">@null</item>  
            <item name="android:windowNoTitle">true</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>  
    </style> 
  • 相关阅读:
    JS如何判断滚动条是否滚到底部滚动加载瀑布流下拉刷新
    jmeter-22-监控方案-nMon
    jmeter-21-监控方案-severAgent监控
    jmeter-19-慢查询
    jmeter-18-性能监控-Grafana的安装和使用指南(windows)-01
    jmeter-17-性能项目分析与调优实战--场景设置
    jmeter-16-逻辑控制器
    setInterval, setTimeout, requestAnimationFrame 详细说明
    Http代理服务器录制
    康复训练
  • 原文地址:https://www.cnblogs.com/stuart/p/4536702.html
Copyright © 2011-2022 走看看