Настройка темы ActionBarSherlock для приложения Android

ЧИТАЙТЕ ОБНОВЛЕНИЕ 2 НИЖЕ ДЛЯ ОТВЕТА

Я пытаюсь использовать ActionBarSherlock в моем приложении. Я извлек релиз 4.0.0 из репозитория github проекта, встроил его в Netbeans, затем скопировал файл library-4.0.0.jar в каталог lib моего проекта (я не использую Eclipse).

Сейчас это просто скелет, и он отлично запускается в ICS, но когда я запускаю его на Gingerbread, я получаю следующее исключение, жалуясь на то, что у меня нет темы приложения для Theme.Sherlock (или подобного):

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arashpayan.prayerbook/com.arashpayan.prayerbook.PrayerBook}: java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3683)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.
    at com.actionbarsherlock.internal.ActionBarSherlockCompat.generateLayout(ActionBarSherlockCompat.java:987)
    at com.actionbarsherlock.internal.ActionBarSherlockCompat.installDecor(ActionBarSherlockCompat.java:899)
    at com.actionbarsherlock.internal.ActionBarSherlockCompat.setContentView(ActionBarSherlockCompat.java:852)
    at com.actionbarsherlock.ActionBarSherlock.setContentView(ActionBarSherlock.java:655)
    at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.java:316)
    at com.arashpayan.prayerbook.PrayerBook.onCreate(PrayerBook.java:44)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    ... 11 more

Строка, на которую он жалуется (Молитвенник:44), является призывом к setContentView, Приложение состоит из одного действия с onCreate() метод, который я называю setTheme() сверху:

public void onCreate(Bundle savedInstanceState)
{
        setTheme(com.actionbarsherlock.R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);

        TextView rootTextView = new TextView(this);
        rootTextView.setText("Hello, world!");
        setContentView(rootTextView);

        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ActionBar.Tab tab = getSupportActionBar().newTab();
        tab.setText("Prayers");
        getSupportActionBar().addTab(tab);

        tab = getSupportActionBar().newTab();
        tab.setText("Recents");
        getSupportActionBar().addTab(tab);

        tab = getSupportActionBar().newTab();
        tab.setText("Bookmarks");
        getSupportActionBar().addTab(tab);
}

Должно быть, я неправильно задаю тему, но я просто не понимаю, как это сделать. Кто-нибудь может помочь?

ОБНОВЛЕНИЕ Ниже CommonsWare отметил, что тема может быть установлена ​​в AndroidManifest.xml. Я пробовал это так:

<application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@style/Theme.Sherlock">
        <activity android:name="PrayerBook"
                  android:label="@string/app_name"
                  android:configChanges="orientation|keyboardHidden|screenLayout|uiMode|mcc|mnc|locale|navigation|fontScale|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="LanguagesActivity" />
</application>

но Ant выдает ошибку при попытке собрать приложение:

/Users/arash/coding/prayerbook/AndroidManifest.xml:7: error: Error: No resource found that matches the given name (at 'theme' with value '@style/Theme.Sherlock').

ОБНОВЛЕНИЕ 2 С помощью CommonsWare в его последующих комментариях я смог заставить его работать. Мне нужно было добавить ActionBarSherlock в качестве зависимости проекта. Для этого

1) я удалил library-4.0.0.jar а также android-support-4.0.jar из моего проекта lib каталог.

2) Затем перейдите в library папка внутри корня каталога ActionBarSherlock извлечена из github. Тип android update project так build.xml а также proguard.cfg файл будет создан для библиотеки.

3) Наконец, cd вернуться в основную директорию проекта и добавить ABS как библиотечную зависимость с android update project --path . --library ../ActionBarSherlock/libraryПуть к --library в команде будет меняться в зависимости от того, где вы проверили репо. ActionBarSherlock и каталог проекта моего приложения были одноуровневыми каталогами.

7 ответов

Решение

Обычно вы задаете свою тему в манифесте, как показано в документации для разработчиков Androidна которую ссылается страница тем ActionBarSherlock).

Если вы хотите использовать ActionBarSherlock везде в вашем приложении, это работает:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock">

Для меня это было вызвано неиспользованием @style/ префикс. Т.е. у меня было

<style name="AppTheme" parent="Theme.Sherlock.Light" />

вместо

<style name="AppTheme" parent="@style/Theme.Sherlock.Light" />

Что довольно странно, потому что я клянусь, что значение шаблона по умолчанию выглядит примерно так:

<style name="AppTheme" parent="android:Theme.Holo.Light" />
<!--Provides resources-->
<dependency>
   <groupId>com.actionbarsherlock</groupId>
   <artifactId>library</artifactId>
   <version>4.1.0</version>
   <type>apklib</type>
</dependency>
<!-Provides import links-->
<dependency>
   <groupId>com.actionbarsherlock</groupId>
   <artifactId>library</artifactId>
   <version>4.1.0</version>
   <type>jar</type>
   <scope>provided</scope>
 </dependency>

Подсказка заключается в использовании типа "apklib", это означает, что maven будет использовать все источники (ресурсы тоже). Другая зависимость от jar-файла (область действия "предоставляется") используется для получения ссылки на классы sherlock во время кодирования.

Была такая же проблема. Приложение зависало, хотя тема была указана в манифесте. Установка темы программно решила проблему:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);

Это происходило со мной в IntelliJ IDEA. Я решил эту проблему, выбрав Файл> Структура проекта> Параметры проекта> Фасеты> Выберите модуль actionbarsherlock во 2-м столбце> Установите флажок "Библиотечный модуль"> Применить и OK > Сохранить и перестроить.

ОБНОВЛЕНИЕ После дальнейшего рассмотрения мой первоначальный ответ может быть слишком конкретным, и, вероятно, будет работать только в определенных случаях. Эта ошибка означает, что зависимости не были правильно настроены. В IntelliJ IDEA выполните следующие шаги для правильной настройки actionbarsherlock как зависимости модуля:

  1. Загрузите и извлеките библиотеку actionbarsherlock из zip-файла (Примечание: вам нужна только папка "actionbarsherlock")
  2. Скопируйте и вставьте его вместе с вашим проектом Android
  3. Откройте свой проект в IntelliJ
  4. Файл> Структура проекта> Настройки проекта> Модули> Добавить (зеленый '+' над вторым столбцом) > Импортировать модуль> Выбрать каталог actionbarsherlock в диалоговом окне браузера файлов> ОК> Создать модуль из существующих источников> Далее
  5. Снимите флажок с "тестовой" папки, чтобы она не добавлялась в проект, и нажмите "Далее"
  6. На вкладке "Библиотеки" необходимо проверить android-support-v4, нажать "Далее"
  7. На вкладке Модули необходимо проверить actionbarsherlock, нажать "Далее"
  8. Если вас попросят перезаписать actionbarsherlock.iml, выберите "Перезаписать", а затем "Готово" (вы должны вернуться в раздел "Модули" диалогового окна "Структура проекта").
  9. Выберите модуль actionbarsherlock из второго столбца и на вкладке "Зависимости" в третьем столбце установите флажок "Экспорт" рядом с библиотекой android-support-v4.
  10. Почти готово!
  11. Теперь выберите модуль проекта во втором столбце и на вкладке "Зависимости" нажмите кнопку "Добавить" (зеленый "+" в правой части диалогового окна)
  12. Выберите Module Dependency, выберите actionbarsherlock из всплывающего диалогового окна и нажмите "ОК".
  13. Теперь нажмите "Применить" или "ОК", чтобы принять изменения

Это должно делать свое дело.

Если вы хотите использовать собственный стиль, я сделал шаблон для пользовательского стиля ActionBarSherlock. Тема определена в файле /values/styles.xml. Он расширен от темы Theme.Sherlock.Light. Существует множество параметров, которые вы можете установить: значок, логотип, разделитель, заголовок, наложение тени, кнопки меню действий, всплывающее меню, фон режима действий, навигация по выпадающему списку, стиль вкладок, параметры отображения и т. Д. Почти все, что вам нужно, чтобы создайте свою собственную тему панели действий. Я использую этот шаблон в своих приложениях, потому что он помогает мне очень быстро стилизовать панель действий.

Вы можете найти этот шаблон на моем GitHub. Он очень прост в использовании. Просто скопируйте значения и директории drawable в ваш проект и установите параметр android:theme в элементе приложения в AndroidManifest.xml:

<application
    ...
    android:theme="@style/Theme.Example">

Drawables в моем шаблоне были сгенерированы с помощью Android Action Bar Generator Style Generator. Я использую другое соглашение об именах для ресурсов. Этот простой скрипт переименовывает все ресурсы, созданные с помощью Android Action Bar Generator Style, в соответствии с моим собственным соглашением, используемым в шаблоне.

Это не ответ на вопрос ОП, но я просто опишу, как мне удалось получить то же исключение, о котором он упоминает, в надежде, что это может помочь кому-то еще:

    java.lang.RuntimeException: Unable to start activity
    ComponentInfo{com.Merlinia.MMessaging_Test/com.Merlinia.MMessaging_Test.TestObjectsActivity}: 
    java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.

В моем случае решение было очень простым, хотя мне потребовалось слишком много времени, чтобы найти его. Все, что вы читаете об этом исключении, гласит: "проверьте, что вы указали тему в файле manifest.xml", поэтому я быстро взглянул на мой файл manifest.xml, и вот оно. Тогда я попробовал разные вещи.

Наконец, я внимательно посмотрел на мой файл manifest.xml. Я сделал ошибку, указав тему для основной деятельности, а не для всего приложения!

Другие вопросы по тегам