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

ПРОЧИТАЙТЕ ОБНОВЛЕНИЕ 2 НИЖЕ, ЧТОБЫ ОТВЕТИТЬ

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


person Arash Payan    schedule 18.03.2012    source источник
comment
Скачайте пример исходного кода приложения ABS на github ABS и посмотрите   -  person xDragonZ    schedule 18.03.2012
comment
Это было первое место, которое я проверил. В демонстрационном приложении ABS статический член THEME класса SampleList инициализируется R.style.Theme_Sherlock, но никогда не используется в этом действии, за исключением изменения его сохраненного значения в меню параметров. Все действия начинались с этого основного вызова действия setTheme() с этой константой в качестве аргумента в самом начале их метода onCreate(), поэтому я делаю то же самое в своем коде. Вы заметите, что та же инструкция также указана во втором абзаце раздела «Родительские темы» на сайте ABS. actionbarsherlock.com/theming.html   -  person Arash Payan    schedule 18.03.2012


Ответы (7)


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

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

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock">
person CommonsWare    schedule 18.03.2012
comment
Верно. Я пробовал именно это перед публикацией, но получаю /AndroidManifest.xml:7: ошибка: Ошибка: не найден ресурс, соответствующий заданному имени (в «теме» со значением «@style/Theme.Sherlock»). Я обновлю вопрос, чтобы указать на это. - person Arash Payan; 18.03.2012
comment
@ArashPayan: удалите созданный вами JAR. Добавьте ActionBarSherlock в свое приложение в качестве проекта библиотеки Android. В то время как документация ActionBarSherlock (см. Включение в ваш проект) цитирует только Eclipse и Maven, как это сделать, вы сможете добавить его как проект библиотеки в NetBeans, следуя документации для разработчиков Android: developer.android.com/guide/developing/projects/ - person CommonsWare; 18.03.2012
comment
Это помогло. Мне также пришлось удалить файл android-support-v4.jar, поскольку он входит в состав ABS. Я опишу все шаги, которые я предпринял выше. Спасибо! - person Arash Payan; 18.03.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" />
person Timmmm    schedule 01.11.2012
comment
Только что столкнулся с этим, спасибо за ваш ответ. Определенно потратил слишком много времени, пробуя другие вещи. - person Mike P.; 30.03.2013

<!--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 (область «предоставлена») используется для получения ссылки на классы Шерлока во время кодирования.

person Apple.Dragon    schedule 30.07.2012

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
person Apfelsaft    schedule 17.04.2013
comment
Что бы это ни стоило, этот ответ также рекомендуется в этой теме stackoverflow.com/questions/12864298/, но Джейк Уортон, автор ActionBarSherlock, написал в комментарии, что ответ был неверным. - person RenniePet; 02.09.2013

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

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

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

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

person kahmali    schedule 24.07.2013

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

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

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

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

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

person RenniePet    schedule 01.09.2013