Как кодировать обратно совместимую новую функцию в Android SDK? - PullRequest
11 голосов
/ 05 марта 2012

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

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

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

1 Ответ

18 голосов
/ 06 марта 2012

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

В своем файле 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.

Веселитесь!

...