Настройка ActionBarSherlock Theme для приложения Android - PullRequest
42 голосов
/ 18 марта 2012

ЧИТАТЬ ОБНОВЛЕНИЕ 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);
}

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

UPDATE Ниже 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 ]

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

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

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

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock">
19 голосов
/ 01 ноября 2012

Для меня это было вызвано неиспользованием префикса @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 голосов
/ 30 июля 2012
<!--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 во время кодирования.

1 голос
/ 24 июля 2013

Это происходило со мной в 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 из всплывающего диалогового окна и нажмите «OK»
  13. Теперь нажмите «Применить» или «ОК», чтобы принять изменения

Это должно сработать.

1 голос
/ 17 апреля 2013

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
1 голос
/ 16 января 2013

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

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

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

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

0 голосов
/ 02 сентября 2013

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

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

...