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

READ UPDATE 2 НИЖЕ ДЛЯ ОТВЕТА

Я пытаюсь использовать ActionBarSherlock в своем приложении. Я проверил выпуск 4.0.0 из проекта github repo, построил его в 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

Линия, на которую он жалуется (PrayerBook: 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 и мой каталог проектов приложений были каталогами сестер.

Ответ 1

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

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

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

Ответ 2

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

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

вместо

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

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

<style name="AppTheme" parent="android:Theme.Holo.Light" />

Ответ 3

<!--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 во время кодирования.

Ответ 4

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

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

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

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

Ответ 5

Была та же проблема. Приложение разбилось, пока тема не была установлена ​​в манифесте. Настройка темы программно разрешила проблему:

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

Ответ 6

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

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

  • Загрузите и извлеките библиотеку actionbarsherlock из zip (Примечание. Вам нужна только папка "actionbarsherlock" ).
  • Скопируйте и вставьте его вместе со своим проектом Android
  • Откройте проект в IntelliJ
  • Файл > Структура проектa > Настройки проектa > Модули > Добавить (зеленый "+ над вторым столбцом) > Модуль импортa > Выбрать каталог действий в браузере файлов > ОК > Создать модуль из существующих источников > Далее
  • Снимите флажок "тестовая", чтобы она не была добавлена ​​в проект и нажмите "Далее"
  • На вкладке "Библиотеки" необходимо проверить поддержку android-support-v4, нажать "Далее"
  • На вкладке "Модули" необходимо проверить флажок actionbarsherlock, нажать "Далее"
  • Если он попросит вас перезаписать actionbarsherlock.iml, выберите "Перезаписать", а затем "Готово" (вы должны быть возвращены в раздел "Модули" в диалоговом окне "Структура проекта" ).
  • Выберите модуль actionbarsherlock из второго столбца и на вкладке "Зависимости" в третьем столбце установите флажок "Экспорт" рядом с библиотекой android-support-v4.
  • Почти там!
  • Теперь выберите модуль проекта из второго столбца, а на вкладке "Зависимости" нажмите кнопку "Добавить" (зеленый "+" в правой части диалогового окна).
  • Выберите Dependency Module и выберите actionbarsherlock в появившемся диалоговом окне и нажмите "OK"
  • Теперь нажмите "Применить" или "ОК", чтобы принять изменения.

Это должно сделать трюк.

Ответ 7

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

    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. Я сделал ошибку, указав тему для основной деятельности, а не для всего приложения!