Попробуйте использовать Window.FEATURE_CUSTOM_TITLE, но получите исключение: вы не можете комбинировать пользовательские заголовки с другими функциями заголовков.
Я пытаюсь использовать пользовательский заголовок, чтобы добавить кнопку изображения в строку заголовка. Я получил много помощи от этого поста: android: добавление кнопки в заголовок приложения?, но не смог заставить его работать для моего ListActivity.
Вкратце, вот что я имею:
- Я скрываю заголовок в AndroidManifest.xml
Укажите относительный макет для пользовательского заголовка (workorder_list_titlebar.xml)
Мой класс активности выглядит следующим образом:
открытый класс WorkOrderListActivity extends ListActivity { String[] orders={"WO-12022009", "WO-12302009","WO-02122010", "02152010"}; @Override public void onCreate(BundlevedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); this.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.workorder_list_titlebar); setContentView(R.layout.workorder_list); setListAdapter(новый ArrayAdapter(this,R.layout.workorder_list, R.id.label,orders)); } }
Когда я запустил приложение, я получил AndroidRuntimeException: вы не можете комбинировать пользовательские заголовки с другими функциями заголовков.
Основываясь на трассировке стека, исключение было вызвано com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:183), которое было вызвано вызовом setlistAdapter.
У кого-нибудь есть такая же проблема с ListActivity? Также, когда мне удастся получить эту работу, как мне прикрепить слушателей к кнопке с изображением, чтобы она что-то сделала?
Заранее спасибо.
11 ответов
У меня была такая же проблема, и я исправляю ее, удаляя
<item name="android:windowNoTitle">true</item>
от моего theme.xml
Заставьте вас создать собственный стиль в папке "values". Убедитесь, что вы написали код, как показано ниже.
<style name="CustomTheme" parent="android:Theme">
Не изменяйте родительский параметр.
Это сработало для меня.
Вместо изменения вашего theme.xml вы также можете:
создайте новый файл стиля XML my_theme.xml в папке значений следующим образом:
<style name="MyWindowTitleBackground">
<item name="android:background">#444444</item>
</style>
<style name="MyTheme" parent="android:Theme">
<item name="android:windowTitleBackgroundStyle">@style/MyWindowTitleBackground</item>
</style>
Вы можете определить другие настройки, как вам нравится в этой теме.
Затем просто используйте эту тему в своем манифесте в атрибутах действия
android:theme="@style/MyTheme"
Наконец, установите свой пользовательский заголовок, как всегда в вашем activity.java:
final Window window = getWindow();
boolean useTitleFeature = false;
// If the window has a container, then we are not free
// to request window features.
if (window.getContainer() == null) {
useTitleFeature = window
.requestFeature(Window.FEATURE_CUSTOM_TITLE);
}
setContentView(R.layout.screen_main);
if (useTitleFeature) {
window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.custom_title);
// Set up the custom title
main_title = (TextView) findViewById(R.id.title_left_text);
main_title.setText(R.string.app_name);
main_title = (TextView) findViewById(R.id.title_right_text);
main_title.setText(R.string.Main_titleInfo);
}
Не забудьте определить файл custom_title.xml в папке макета. Например...
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical" >
<TextView
android:id="@+id/title_left_text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:ellipsize="end"
android:singleLine="true" />
<TextView
android:id="@+id/title_right_text"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:ellipsize="end"
android:singleLine="true"
android:textColor="#fff" />
</RelativeLayout>
Я думаю, что примечание правильно, что это проблема в действиях во вкладках. Так как некоторые из моих действий могут быть как автономными, так и на вкладке, я обнаружил следующее:
final Window window = getWindow();
boolean useTitleFeature = false;
// If the window has a container, then we are not free
// to request window features.
if(window.getContainer() == null) {
useTitleFeature = window.requestFeature(Window.FEATURE_CUSTOM_TITLE);
}
setContentView(layoutId);
if (useTitleFeature) {
window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title);
}
Может быть, вы найдете эту проблему, когда используете его на вкладке, поскольку там уже есть заголовок, и вы не можете добавить пользовательский заголовок снова.
Вы должны добавить этот пользовательский заголовок в упражнение, которое вы получаете вкладку
Я сделал точно так же, как Санни Дасари, но с одним небольшим изменением я поставил @ before и android в родительский атрибут.
Так что мой код выглядел следующим образом.
<style name="CustomTheme" parent="@android:Theme">
Чтобы избежать сбоев, вы можете просто добавить
android:theme="@style/android:Theme"
к <Activity>
тег в вашем AndroidManifest.xml:
<activity
android:name="test.TestActivity"
android:label="@string/app_name"
android:theme="@style/android:Theme">
Это связано с тем, что стили, определенные в теме по умолчанию, конфликтуют с FEATURE_CUSTOM_TITLE (например, атрибутом android:windowNoTitle
). Используя другую тему, вы можете избежать таких проблем.
Однако вам может понадобиться определить собственную тему для изменения других атрибутов, таких как android:windowTitleSize, цвет фона, цвет текста и шрифт и т. Д. В этом случае вы можете извлечь свою тему из существующей темы (например, Theme. Осветите) и измените его атрибуты:
<resources>
<style name="CustomWindowTitleBackground">
<item name="android:background">#323331</item>
</style>
<style name="CustomTheme" parent="@style/android:Theme.Light">
<item name="android:windowNoTitle">false</item>
<item name="android:windowTitleSize">60dip</item>
<item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item>
</style>
</resources>
Попробуйте поменять местами следующие строки:
setContentView(R.layout.workorder_list);
this.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.workorder_list_titlebar);
Так как я пытался скомпилировать свою программу в Android 4.0, я столкнулся с той же проблемой. Ни одно из этих решений не помогло. Итак, я скопировал содержимое моего стиля из values > styles.xml и вставил его в файл values-v11 styles.xml и values-v14 styles.xml. Бинго, трюк сработал.
Как новичок большинство ответов не помогло мне в моем случае. Так вот мой ответ.
Перейдите в папку res/values в вашем проекте android и проверьте файл strings.xml (этот файл может отличаться в вашем случае, например, themes.xml)
Внутри файла под тегом ресурса проверьте, есть ли у вас теги стиля. Если вы не нашли его, добавьте приведенный ниже код, как указано ниже, в качестве дочернего тега к ресурсам.
что-то вроде ниже
<resources>
<style name="SomeNameHere">
<item name="android:windowNoTitle">true</item>
</style>
</resources>
если у вас уже есть тег стиля, просто добавьте приведенный ниже код в тег стиля
<item name="android:windowNoTitle">true</item>
Я также столкнулся с этой проблемой, и похоже, что это проблема с тем, какая тема применяется к действию в файле AndroidManifest.xml. Если я использую тему как:
android:theme="@android:style/Theme.Holo
Тогда скинет ошибку
android.util.AndroidRuntimeException: You cannot combine custom titles with other title features
Однако, если я использую другую тему, такую как:
android:theme="@android:style/Theme.Black"
тогда он не выдаст ошибку и впоследствии не потерпит крах. Однако я пытаюсь использовать тему как Theme.Holo
, Я не уверен, есть ли способ обойти это.