Попробуйте использовать Window.FEATURE_CUSTOM_TITLE, но получите исключение: вы не можете комбинировать пользовательские заголовки с другими функциями заголовков.

Я пытаюсь использовать пользовательский заголовок, чтобы добавить кнопку изображения в строку заголовка. Я получил много помощи от этого поста: android: добавление кнопки в заголовок приложения?, но не смог заставить его работать для моего ListActivity.

Вкратце, вот что я имею:

  1. Я скрываю заголовок в AndroidManifest.xml
  2. Укажите относительный макет для пользовательского заголовка (workorder_list_titlebar.xml)

  3. Мой класс активности выглядит следующим образом:

    открытый класс 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, Я не уверен, есть ли способ обойти это.

Другие вопросы по тегам