【问题标题】:getSize() giving me errorsgetSize() 给我错误
【发布时间】:2012-03-11 10:03:37
【问题描述】:

当我实施时

WindowManager wm = ((WindowManager)context.getSystemService(context.WINDOW_SERVICE));
Display display = wm.getDefaultDisplay();
m_nDisplayWidth = display.getWidth();
m_nDisplayHeight    = display.getHeight();

我可以正常运行,但是当我实现 getSize 时,我得到 runtimeError

Point size = new Point();
display.getSize(size); //Error right here
m_nDisplayWidth = size.x;
m_nDisplayHeight = size.y;

Logcat:

03-11 01:45:25.865: E/AndroidRuntime(18835): FATAL EXCEPTION: main 
03-11 01:45:25.865: E/AndroidRuntime(18835): android.view.InflateException: Binary XML file line #7: Error inflating class com.brain.development.GameRun
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.LayoutInflater.createView(LayoutInflater.java:518)
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:215) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.app.Activity.setContentView(Activity.java:1679) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at com.brain.development.BrainDevelopmentActivity$1.onClick(BrainDevelopmentActivity.java:25) 03-11 01:45:25.865: E/AndroidRuntime(18835):  at android.view.View.performClick(View.java:2582) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.View$PerformClick.run(View.java:9252) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.os.Handler.handleCallback(Handler.java:587) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.os.Handler.dispatchMessage(Handler.java:92) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.os.Looper.loop(Looper.java:130) 03-11 01:45:25.865: E/AndroidRuntime(18835):     at android.app.ActivityThread.main(ActivityThread.java:3691) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at java.lang.reflect.Method.invokeNative(Native Method) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at java.lang.reflect.Method.invoke(Method.java:507) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at dalvik.system.NativeStart.main(Native Method) 
03-11 01:45:25.865: E/AndroidRuntime(18835): Caused by: java.lang.reflect.InvocationTargetException 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at java.lang.reflect.Constructor.constructNative(Native Method) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at android.view.LayoutInflater.createView(LayoutInflater.java:505) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    ... 19 more 
03-11 01:45:25.865: E/AndroidRuntime(18835): Caused by: java.lang.NoSuchMethodError: android.view.Display.getSize 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at com.brain.development.GameRun$GameThread.<init>(GameRun.java:46) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    at com.brain.development.GameRun.<init>(GameRun.java:97) 
03-11 01:45:25.865: E/AndroidRuntime(18835):    ... 22 more

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    这支持旧设备和新设备:

    private static Point getDisplaySize(final Display display) {
        final Point point = new Point();
        try {
            display.getSize(point);
        } catch (java.lang.NoSuchMethodError ignore) { // Older device
            point.x = display.getWidth();
            point.y = display.getHeight();
        }
        return point;
    }
    

    【讨论】:

    • getWidth 和 getHeight 是自 getSize 方法出现以来已弃用的方法,但它仅适用于 api 级别 13 及以上,因此别无选择,只能将弃用的方法本身用于旧设备。 +1 为你的答案。谢谢
    【解决方案2】:

    获取所有设备显示尺寸的方法:

    private static Point getDisplaySize(final Display display) {
        Point point = new Point();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { // API LEVEL 13
            display.getSize(point);
        } else {    
            point.x = display.getWidth();
            point.y = display.getHeight();
        }
        return point;
    }
    

    开始尺寸:

    WindowManager wm = ((WindowManager)context.getSystemService(context.WINDOW_SERVICE));
    Display display = wm.getDefaultDisplay();
    Point myPoint = getDisplaySize(display);    
    Log.i("***Size X::", String.valueOf(myPoint.x));
    Log.i("***Size Y::", String.valueOf(myPoint.y));
    

    【讨论】:

    • 我认为你缺少 display.getSize()
    • Build.VERSION.SDK_INT 要求 Android API 级别 4 或更高。
    【解决方案3】:

    此版本也适用于 API

    @SuppressWarnings("deprecation")
    @TargetApi(VERSION_CODES.HONEYCOMB_MR2)
    public static Point getSize(Display display) {
        Point point = new Point();
        if (sdkInt() >= VERSION_CODES.HONEYCOMB_MR2) {
            display.getSize(point);
        } else {
            point.set(display.getWidth(), display.getHeight());
        }
        return point;
    }
    
    @SuppressWarnings("deprecation")
    public static int sdkInt() {
        return Integer.parseInt(VERSION.SDK);
    }
    

    【讨论】:

      【解决方案4】:

      试试这个,它对我有用。

      getWindowManager().getDefaultDisplay().getWidth();
      

      【讨论】:

      【解决方案5】:

      尝试改用它:

      Display display = getWindowManager().getDefaultDisplay();
      

      没有它,我看不出这段代码有什么问题...

      【讨论】:

        【解决方案6】:

        很抱歉我迟到了,但请确保您使用的是 android sdk 13 或更高版本。

        【讨论】:

        • 如果您希望您的应用程序在旧版本上运行......就像大多数手机一样?
        【解决方案7】:

        这是实用方法,您可以使用:

        public static int getWidth(Context context) {
            WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Display display = windowManager.getDefaultDisplay();
            Point size = new Point();
            int width;
            if (Build.VERSION.SDK_INT >= 13) {
                display.getSize(size);
                width = size.x;
            } else {
                width = display.getWidth();
            }
            return width;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-12
          • 2015-11-04
          • 2019-01-25
          • 2012-03-26
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多