【问题标题】:How to get screen width and height如何获取屏幕宽度和高度
【发布时间】:2011-09-25 03:07:50
【问题描述】:

我尝试使用以下代码在android应用开发中获取屏幕宽度和高度:

Display display = getWindowManager().getDefaultDisplay(); 
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();

但我的display 得到NullPointerException,为什么?那么如何获取屏幕宽度和高度呢?

【问题讨论】:

  • 这3行放在哪里?执行代码时,默认显示可能尚未准备好。请发布代码上下文。尝试在 Activity 的 onCreate() 中调用它。
  • 您是否尝试在辅助类中执行此操作,而不是 Activity?
  • 如果其中一个解决了您的问题,您应该接受答案。
  • 如果这些答案之一被标记为正确,那就太好了。
  • 不要使用getWindowManager().getDefaultDisplay(),你不能保证你是当前的显示器。

标签: android android-layout android-emulator android-activity android-widget


【解决方案1】:

如果您在 Activity 之外调用它,则需要将上下文传入(或通过其他调用获取)。然后使用它来获取您的显示指标:

DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

更新:对于 API 级别 17+,您可以使用 getRealSize

Point displaySize = new Point();
activity.getWindowManager().getDefaultDisplay().getRealSize(displaySize);

如果你想要可用的窗口大小,可以使用getDecorView通过从实际显示大小中减去装饰视图大小来计算可用区域:

Point displaySize = new Point();
activity.getWindowManager().getDefaultDisplay().getRealSize(displaySize);

Rect windowSize = new Rect();
ctivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(windowSize);

int width = displaySize.x - Math.abs(windowSize.width());
int height = displaySize.y - Math.abs(windowSize.height());
return new Point(width, height);

getRealMetrics 也可以工作(需要 API 级别 17+),但我还没有尝试过:

DisplayMetrics metrics = new DisplayMetrics();
activity.GetWindowManager().getDefaultDisplay().getRealMetrics(metrics);

【讨论】:

  • 好答案。请添加在没有上下文的情况下使用 getResources() 的可能性。
  • @Kostanos getResources() 是 Context 类的一个抽象方法,没有 Context 就不能使用它。如果你在一个活动中,你可以打电话给getResources();如果您在视图中,您可以使用getContext().getResources()。如果这些都不适合您并且您不想传递上下文,请参阅this StackOverflow question 以获取替代解决方案。希望有帮助!
  • 你是对的,它适用于 AndEngine 活动类,但可能不适用于 SDK 中的默认 Activity 类。谢谢。
  • @Kostanos 它适用于任何 Activity,但仅仅是因为 Activity 扩展了 Context。
  • 这是答案,不知道为什么@Leem 不会接受这个或至少一个答案..
【解决方案2】:

在一个活动中,你可以调用:

int width = this.getResources().getDisplayMetrics().widthPixels;
int height = this.getResources().getDisplayMetrics().heightPixels;

当你在一个视图中时,你需要先获取上下文:

int width = getContext().getResources().getDisplayMetrics().widthPixels;
int height = getContext().getResources().getDisplayMetrics().heightPixels;

这适用于所有 Android 版本,从 API 1 开始可用,并且从未被弃用。

【讨论】:

  • getApplicationContext() 用于从 Fragment 而非 View 中获取上下文。从视图来看,它将改为 getContext()。
  • @OliverHausler getContext 也可以使用,但前提是您在视图中。 getApplicationContext 可以在视图和片段中工作,也可以在活动中工作。它基本上为您提供了整个应用程序的上下文,更重要的是在调用资源获取像素大小之前先获取上下文。如果您有任何反对意见,请提供强有力的反对理由。
  • 我没有否决任何事情,我只是评论说你所说的不正确,确实如此。 “当您在视图中时,您需要先获取上下文”-> int width = getApplicationContext().getResources().getDisplayMetrics().widthPixels; 在视图中不起作用。
  • 应该,确实。正确尝试,就像所有其他支持者一样。
  • 检查参考developer.android.com/reference/android/view/… 和/或尝试一下。视图中没有 getApplicationContext() 方法。
【解决方案3】:

来自服务:

Display  display= ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth(); 
int height = display.getHeight(); 

【讨论】:

    【解决方案4】:

    这最终对我有用:

    DisplayMetrics metrics = this.getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;
    

    【讨论】:

      【解决方案5】:

      如果您有可用的上下文,请通过context.getResources().getDisplayMetrics() 尝试。

      【讨论】:

      • 您能说得更具体些吗?我的意思是接下来会发生什么?
      • developer.android.com/reference/android/content/…,所以通常是一个活动。
      • @Leem 接下来你把它放在一个变量中,你可以直接从变量中获取widthPixels(宽度)和heightPixels(高度)。
      【解决方案6】:
      DisplayMetrics metrics = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(metrics);
      
      int height = metrics.heightPixels;
      int width = metrics.widthPixels;
      

      我猜你写的代码已经被弃用了。

      【讨论】:

        【解决方案7】:
        if (Build.VERSION.SDK_INT >= 11) {
                Point size = new Point();
                try {
                    this.getWindowManager().getDefaultDisplay().getRealSize(size);
                    screenWidth = size.x;
                    screenHeight = size.y;
                } catch (NoSuchMethodError e) {
                     screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
                     screenWidth=this.getWindowManager().getDefaultDisplay().getWidth();
                }
        
            } else {
                DisplayMetrics metrics = new DisplayMetrics();
                this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
                screenWidth = metrics.widthPixels;
                screenHeight = metrics.heightPixels;
            }
        

        【讨论】:

        • 但代码略有错误:getRealSize 是在 API 17 中添加的
        【解决方案8】:

        尝试使用以下代码获取屏幕的宽度和高度

        int widthOfscreen =0;
        int heightOfScreen = 0;
        DisplayMetrics dm = new DisplayMetrics();
                try {
                    ((Activity) context).getWindowManager().getDefaultDisplay()
                            .getMetrics(dm);
                } catch (Exception ex) {
                }
                 widthOfscreen  = dm.widthPixels;
        heightOfScreen  = dm.heightPixels;
        

        【讨论】:

          【解决方案9】:
          WindowManager w = getWindowManager();
          Display d = w.getDefaultDisplay();
          DisplayMetrics metrics = new DisplayMetrics();
          d.getMetrics(metrics);
          
          Log.d("WIDTH: ", String.valueOf(d.getWidth()));
          Log.d("HEIGHT: ", String.valueOf(d.getHeight()));
          

          【讨论】:

            【解决方案10】:
                   /*
                    *DisplayMetrics: A structure describing general information about a display, such as its size, density, and font scaling.
                    * */
            
             DisplayMetrics metrics = getResources().getDisplayMetrics();
            
                   int DeviceTotalWidth = metrics.widthPixels;
                   int DeviceTotalHeight = metrics.heightPixels;
            

            【讨论】:

              【解决方案11】:
                  int scrWidth  = getWindowManager().getDefaultDisplay().getWidth();
                  int scrHeight = getWindowManager().getDefaultDisplay().getHeight();
              

              【讨论】:

              • 您好,您的帖子已被标记为“低质量”,可能是因为它仅包含代码。您可以通过解释这究竟是如何以及为什么回答问题来大大改进您的答案?
              • 它是否返回宽度和高度(以像素为单位)
              【解决方案12】:
              Display display = getActivity().getWindowManager().getDefaultDisplay(); 
              int screenWidth = display.getWidth();
              int screenHeight = display.getHeight();
              Log.d("Tag", "Getting Width >> " + screenWidth);
              Log.d("Tag", "Getting Height >> " + screenHeight);
              

              这在我的应用程序中正常工作

              【讨论】:

                【解决方案13】:

                使用函数的另一种方式

                private int[] getScreenSIze(){
                        DisplayMetrics displaymetrics = new DisplayMetrics();
                        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
                        int h = displaymetrics.heightPixels;
                        int w = displaymetrics.widthPixels;
                
                        int[] size={w,h};
                        return size;
                
                    }
                

                在按钮单击或创建功能上添加以下代码

                int[] screenSize= getScreenSIze();
                        int width=screenSize[0];
                        int height=screenSize[1];
                        screenSizes.setText("Phone Screen sizes \n\n  width = "+width+" \n Height = "+height);
                

                See demo source code

                【讨论】:

                  【解决方案14】:

                  下面的答案支持10以下和以上的api级别

                   if (Build.VERSION.SDK_INT >= 11) {
                              Point size = new Point();
                              try {
                                  this.getWindowManager().getDefaultDisplay().getRealSize(size);
                                  screenWidth = size.x;
                                  screenHeight = size.y;
                              } catch (NoSuchMethodError e) {
                                   screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
                                   screenWidth=this.getWindowManager().getDefaultDisplay().getWidth();
                              }
                  
                          } else {
                              DisplayMetrics metrics = new DisplayMetrics();
                              this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
                              screenWidth = metrics.widthPixels;
                              screenHeight = metrics.heightPixels;
                          }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2010-11-25
                    • 2011-08-06
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-11-07
                    • 2011-06-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多