8

では、これに対応するコードをどのように記述すればよいでしょうか。非推奨の API 呼び出しをコードに残したくありませんが、(少し) 古いデバイスを使用しているユーザーを失いたくありません。実装できるある種の互換性設定はありますか?

相対 コード

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screen_width = size.x;
int screen_height = size.y;

対古い方法:

int screen_width = getWindowManager().getDefaultDisplay().getWidth();
int screen_height = getWindowManager().getDefaultDisplay().getHeight();
4

5 に答える 5

3

あなたはこのようなことをすることができます

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
           //do stuff pertaining to this version here
}else{
           //other versions
}
于 2012-05-03T20:44:53.160 に答える
3

最良の (つまり、ほぼ毎回機能するオプションを意味します) オプションは、リフレクションを使用することです。Android Backwards Compatibility Backwards Compatibilityガイドライン (リフレクションに関する記事の新しい場所で更新) を確認してください。

tyczj の答えは、非推奨の関数がまだ SDK にある限り完全に機能しますが、それらが削除されるとすぐに、最新の SDK に対してビルドしたい場合は、それらを使用したり、古いデバイスでアプリを実行したりする方法がなくなります。 .

リフレクションは、実行時に関数を効果的に動的に検出することでこの問題を解決します。つまり、ICS に対してビルドした場合でも、minSdkVersion が正しい限り、アプリを Gingerbread や Froyo を搭載したデバイスで実行できます。

于 2012-05-03T20:51:04.997 に答える
1

RivieraKid が示唆していることは、次のようなものだと思います。

static Point getDisplaySize(Display d)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        return getDisplaySizeGE11(d);
    }
    return getDisplaySizeLT11(d);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
static Point getDisplaySizeGE11(Display d)
{
    Point p = new Point(0, 0);
    d.getSize(p);
    return p;
}
static Point getDisplaySizeLT11(Display d)
{
    try
    {
        Method getWidth = Display.class.getMethod("getWidth", new Class[] {});
        Method getHeight = Display.class.getMethod("getHeight", new Class[] {});
        return new Point(((Integer) getWidth.invoke(d, (Object[]) null)).intValue(), ((Integer) getHeight.invoke(d, (Object[]) null)).intValue());
    }
    catch (NoSuchMethodException e2) // None of these exceptions should ever occur.
    {
        return new Point(-1, -1);
    }
    catch (IllegalArgumentException e2)
    {
        return new Point(-2, -2);
    }
    catch (IllegalAccessException e2)
    {
        return new Point(-3, -3);
    }
    catch (InvocationTargetException e2)
    {
        return new Point(-4, -4);
    }
}
于 2013-04-17T14:03:39.790 に答える
0

私は通常、スーパークラスを持っています。現在の画面サイズでポイントを取得するための汎用メソッドを持つ BaseActivity。実際の活動では、すべてをきれいに保ちます。

/**
 * Return screen size as a point.
 * @return
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
@SuppressWarnings("deprecation")
protected Point getSize() {
    final Point point = new Point();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
        getWindowManager().getDefaultDisplay().getSize(point);
    }
    else {
        final Display display = getWindowManager().getDefaultDisplay();
        point.x = display.getWidth();
        point.y = display.getHeight();
    }
    return point;
}
于 2014-05-22T06:53:04.180 に答える