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