web-dev-qa-db-ja.com

Android非推奨の画面サイズを取得しますか?

アプリケーションで画面の幅を取得する必要があります。アプリケーションは2.1以降で実行されます。以下のように設定しました。このメソッドは非推奨であり、おそらくgetSizeまたは他の方法を使用する必要があります。しかし、問題は次のとおりです。これはAndroid 3.0+や4.0+などのバージョンで機能しますか、それともアプリがクラッシュしますか。以前にスレッドで非推奨のメソッドを使用したことがあり、アプリが作成されました。アイスクリームデバイスでクラッシュします。以下の方法は機能しますか?

 Display display = getWindowManager().getDefaultDisplay(); 
     int width = display.getWidth();
     int height = display.getHeight();

編集:

GetSizeを試しましたが、機能しません。

  Display display = getWindowManager().getDefaultDisplay();
      Point size = new Point();
      display.getSize(size);
      int width = size.x;
      int height = size.y;
14
Ukjent

これらの非推奨のメソッドがAndroid 3および4で機能するかどうかはわかりません。エミュレーターでテストするのが最善の方法です。

ただし、互換性を最大化するためのここでの最も安全な方法は、リフレクションを使用して1つの方法を試し、もう1つの方法にフォールバックすることです。基本的に、失敗しない独自のバージョンのgetSize()を作成できます。このATMをテストすることはできませんが、次のようになります。

void overrideGetSize(Display display, Point outSize) {
    try {
      // test for new method to trigger exception
      Class pointClass = Class.forName("Android.graphics.Point");
      Method newGetSize = Display.class.getMethod("getSize", new Class[]{ pointClass });

      // no exception, so new method is available, just use it
      newGetSize.invoke(display, outSize);
    } catch(NoSuchMethodException ex) {
      // new method is not available, use the old ones
      outSize.x = display.getWidth();
      outSize.y = display.getHeight();
    }
}

そしてもちろん、次のようなものでそれを呼び出すだけです

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
overrideGetSize(display, size);
12
Steve Blackwell

よくわかりませんが、これでうまくいく可能性があります。

if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
    Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int height = display.getHeight();
} else {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;
}
23
AndDev

Eclipseが警告やエラーを出さないように、Steveの役立つコードを拡張しました。また、少し再構築しました。 PointクラスはAPIレベル1から存在しているため、リフレクションを使用して作成してもあまりメリットはありませんでした。

  final static String mTAG = "MYTAG";

  // Cope with deprecated getWidth() and getHeight() methods
  Point getSize(Display xiDisplay) 
  {
    Point outSize = new Point();
    boolean sizeFound = false;

    try 
    {
      // Test if the new getSize() method is available
      Method newGetSize = 
        Display.class.getMethod("getSize", new Class[] { Point.class });

      // No exception, so the new method is available
      Log.d(mTAG, "Use getSize to find screen size");
      newGetSize.invoke(xiDisplay, outSize);
      sizeFound = true;
      Log.d(mTAG, "Screen size is " + outSize.x + " x " + outSize.y);
    } 
    catch (NoSuchMethodException ex) 
    {
      // This is the failure I expect when the deprecated APIs are not available
      Log.d(mTAG, "getSize not available - NoSuchMethodException");
    }  
    catch (InvocationTargetException e) 
    {
      Log.w(mTAG, "getSize not available - InvocationTargetException");
    } 
    catch (IllegalArgumentException e) 
    {
      Log.w(mTAG, "getSize not available - IllegalArgumentException");
    } 
    catch (IllegalAccessException e) 
    {
      Log.w(mTAG, "getSize not available - IllegalAccessException");
    }

    if (!sizeFound)
    {
      Log.i(mTAG, "Used deprecated methods as getSize not available");
      outSize = new Point(xiDisplay.getWidth(), xiDisplay.getHeight());
    }

    return outSize;
  }
3
Dan J

https://stackoverflow.com/a/1016941/291414 によると:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
2
CoolMind

Displayの新しい関数 getSize() の何が問題になっていますか? Pointオブジェクトを必要な幅と高さの値に変換するのは本当に簡単です。

0
Turnsole