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