2

I have a strange behaviour on Samsung devices (Galaxy S4, Galaxy Note, ...). In our App we have a themed Actionbar (using ActionbarCompat) with a search interface. Basically we followed the tutorial here: http://developer.android.com/guide/topics/search/search-dialog.html

This is the default look of our Actionbar which works fine: Themed Actionbar default look

Furthermore, if i touch the search icon the theme is also applied and works well: SearchView opened by search icon

But if I do a long press on the menu button of Samsung devices, the search will be opened with an default theme: SearchView opened with Menu button

I already added the theme in our (custom)-Application class, but no change appears.

@Override
public void onCreate() {
    super.onCreate();
    setTheme(R.style.ClassicTheme);
}

How can I avoid this strange behaviour? Do I have to add something to our styles? This is my basic theme:

<style name="ClassicTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="themeIdentifier">classic</item>
    <item name="android:windowBackground">@color/grey_default</item>
    <item name="popupMenuStyle">@style/ClassicTheme.PopupMenu</item>
    <item name="textAppearanceLargePopupMenu">
        @style/ClassicTheme.PopupMenuTextAppearanceLarge
    </item>
    <item name="textAppearanceSmallPopupMenu">
        @style/ClassicTheme.PopupMenuTextAppearanceSmall
    </item>
    <item name="android:popupMenuStyle">@style/ClassicTheme.PopupMenu</item>
    <item name="actionBarSearchIcon">@drawable/ic_classic_menu_search</item>
    <item name="actionBarSearchBackground">@drawable/textfield_classic_ab</item>
    <item name="actionBarToggler">@drawable/ic_classic_menu_menu_left</item>
    <item name="android:actionBarStyle">@style/ClassicTheme.ActionBar</item>
    <item name="android:dropDownListViewStyle">@style/ClassicTheme.DropDownListView</item>
    <item name="dropDownListViewStyle">@style/ClassicTheme.DropDownListView</item>
    <item name="android:actionDropDownStyle">@style/ClassicTheme.DropDownNav</item>
    <item name="android:actionBarWidgetTheme">@style/ClassicTheme.Widget</item>
    <item name="android:actionOverflowButtonStyle">@style/ClassicTheme.OverFlow</item>
    <item name="android:actionBarItemBackground">@drawable/selector_classic_simple_fast</item>
    <item name="android:spinnerItemStyle">@style/ClassicTheme.SpinnerItemStyle</item>>
</style>

<style name="ClassicTheme.SpinnerItemStyle" parent="@android:style/Widget.TextView.SpinnerItem">
    <item name="android:textColor">@android:color/white</item>
</style>

<style name="ClassicTheme.ActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/grey_darker</item>
    <item name="android:backgroundStacked">@color/grey_darker</item>
    <item name="android:backgroundSplit">@color/grey_darker</item>
    <item name="android:progressBarStyle">@color/grey_darker</item>

</style>

<style name="ClassicTheme.ListPopupMenu" parent="@style/Widget.AppCompat.ListPopupWindow">
    <item name="android:popupBackground">@drawable/bg_classic_menu_dropdown</item>
</style>


<style name="ClassicTheme.DropDownListView" parent="@style/Widget.AppCompat.ListView.DropDown">
    <item name="android:listSelector">@drawable/selector_classic_simple</item>
    <item name="android:divider">@color/grey_divider</item>
    <item name="android:dividerHeight">1dp</item>
</style>


<!--<item name="android:background">@drawable/spinner_background_ab_ClassicTheme</item>-->
<style name="ClassicTheme.DropDownNav" parent="@style/Widget.AppCompat.Spinner.DropDown.ActionBar">
    <item name="android:background">@drawable/selector_classic_spinner_ab</item>
    <item name="android:popupBackground">@drawable/bg_classic_menu_dropdown</item>
    <item name="android:dropDownSelector">@drawable/selector_classic_simple</item>
    <item name="android:textColor">@android:color/white</item>
</style>

<!-- this style is only referenced in a Light.DarkActionBar based theme -->
<style name="ClassicTheme.Widget" parent="@style/Theme.AppCompat">
    <item name="android:popupMenuStyle">@style/ClassicTheme.PopupMenu</item>
    <item name="android:dropDownListViewStyle">@style/ClassicTheme.DropDownListView</item>
    <item name="searchViewAutoCompleteTextView">@style/ClassicTheme.SearchViewStyle</item>
    <item name="textAppearanceSearchResultSubtitle">@style/ClassicTheme.SearchSuggestionSubtitleStyle</item>
</style>

<style name="ClassicTheme.OverFlow" parent="@style/Widget.AppCompat.ActionButton.Overflow">
    <item name="android:src">@drawable/ic_classic_menu_overflow</item>
</style>

<style name="ClassicTheme.PopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
    <item name="android:popupBackground">@drawable/bg_classic_menu_dropdown</item>
    <item name="android:textColor">@android:color/white</item>
</style>

<style name="ClassicTheme.PopupMenuTextAppearanceSmall" parent="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small">
    <item name="android:textColor">@android:color/white</item>
</style>

<style name="ClassicTheme.PopupMenuTextAppearanceLarge" parent="@style/TextAppearance.AppCompat.Widget.PopupMenu.Large">
    <item name="android:textColor">@android:color/white</item>
</style>

</resources>

Update 21.07.2014: I tried to add actionModeBackground-attribute in my style:

    <item name="actionModeBackground">@drawable/cab_background_top_example</item>
    <item name="android:actionModeBackground">@drawable/cab_background_top_example</item>

But this will only change the look of the actionbar, if I make a selection in a listview. Long-Pressing the menu button keeps the actionbar white.

Furthermore I investigated some time in Android search_bar.xml resource. (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/layout/search_bar.xml) In this file the background will be configured by actionModeBackground-Attribute, but I do not have any idea, why this does not work in my special case.

Christopher
  • 9,682
  • 7
  • 47
  • 76
  • Shouldn't you call `setTheme()` before `super.onCreate()` ? – Michał Z. Jul 21 '14 at 11:15
  • Unfortunately this has no effect in my testings. I think the problem will be caused by Android System, which uses - in my case - the wrong Context for ui-inflation. – Christopher Jul 21 '14 at 11:47

1 Answers1

1

I finally solved this problem by overriding the startSearch(...)-Method of Activity class and expand the Search-MenuItem programmatically if not already open.

@Override
public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
     boolean globalSearch) {
    // menuItemSearch-class attribute will be set up in onCreateOptionsMenu(...)
    if (menuItemSearch == null || globalSearch) {
        super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
        return;
    }
    if (!menuItemSearch.isActionViewExpanded()) {
        menuItemSearch.expandActionView();
    }
}
Christopher
  • 9,682
  • 7
  • 47
  • 76