Как закодировать обратно совместимую новую функцию в Android SDK?

Я хочу использовать функцию действия, включенную в SDK 11. Однако я также хочу, чтобы приложение запускалось на более ранних устройствах из SDK 10 (2.3.3). Я готов отказаться от функции панели действий для более ранних устройств, поскольку это не важная функция. Я проделал все чтение об отражении, классе обертки и некоторых других методах. Я сейчас не понимаю, как это сделать. Я использую Eclipse.

Если я не устанавливаю цель в Eclipse на sdk 11 или выше, то в любом месте, где у меня есть ссылка на actionBar, возникает ошибка компиляции. Если я поставил цель на sdk 11 или выше, она компилируется, но не покажет, что она может работать на более ранних устройствах. Я все время android:minSdkVersion=10.

Может ли кто-нибудь дать мне некоторое представление о том, как сделать ссылки на actionBar, и все же настроить его на целевой уровень sdk? Спасибо заранее.

Ответ 1

Да! Вы можете это сделать. Попробуйте выполнить шаблон, описанный ниже.

В вашем файле AndroidManifest.xml объявите следующее (заменяя версии платформы тем, что требует ваше приложение):

<!-- Build Target -->
<uses-sdk android:targetSdkVersion="14" android:minSdkVersion="7" />

Ориентируясь на версию платформы API 11 или выше, вы разрешаете Eclipse связывать (компилировать) с родными классами ActionBar. Предоставление более ранней версии минимальной платформы позволяет вашему приложению быть установленным (запущенным) в более старых версиях Android.

Ваш код активности должен выглядеть примерно так:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (CompatibilityManager.isHoneycomb()) {
        final ActionBar actionBar = getActionBar();
        actionBar.setDisplayShowHomeEnabled(true);
        // ...
    } else {
        // The ActionBar is unavailable!
        // ...
    }
}

Если класс CompatibilityManager.java просто предоставляет статические вспомогательные методы для определения текущей версии SDK:

public class CompatibilityManager {
    public static final String KINDLE_FIRE_MODEL = "Kindle Fire";

    /**
     * Get the current Android API level.
     */
    public static int getSdkVersion() {
        return android.os.Build.VERSION.SDK_INT;
    }

    /**
     * Determine if the device is running API level 11 or higher.
     */
    public static boolean isHoneycomb() {
        return getSdkVersion() >= Build.VERSION_CODES.HONEYCOMB;
    }

    /**
     * Determine if the device is running API level 14 or higher.
     */
    public static boolean isIceCreamSandwich() {
        return getSdkVersion() >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
    }

    /**
     * Determine if the current device is a first generation Kindle Fire.
     * @return true if the device model is equal to "Kindle Fire", false if otherwise.
     */
    public static boolean isKindleFire() {
        return Build.MODEL.equals(KINDLE_FIRE_MODEL);
    }
}

Вы также можете рассмотреть возможность использования библиотеки ActionBarSherlock, которая обеспечивает совместимый API ActionBar вплоть до Android 2.x:

Библиотека автоматически будет использовать собственную панель действий, когда доступно или будет автоматически завершать пользовательскую реализацию вокруг ваши макеты. Это позволяет легко разрабатывать приложение с помощью панель действий для каждой версии Android обратно через 2.x.

Удачи!