8

I Menüpunkte in meiner app, und ich möchte Farbe Artikel Hintergrund ändern, wenn darauf geklickt wird (siehe Screenshot - Artikel 1 wird angeklickt)Set Menüpunkt Hintergrundfarbe auf schweben in Android

item 1 is clicked

Ich möchte nur eine Farbe hier - entweder hellblau oder dunkel. Wie Sie jedoch sehen können, gibt es zwei von ihnen auf dem ersten Element.

Hier ist mein Code:

Toolbar in der Aktivität:

<android.support.v7.widget.Toolbar 
      xmlns:sothree="http://schemas.android.com/apk/res-auto" 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/main_toolbar" 
      sothree:theme="@style/MyActionBar" 
      android:layout_alignParentTop="true" 
      style="@style/toolbarButton"> 

      ... 

     </android.support.v7.widget.Toolbar> 

Styles:

<style name="toolbarButton"> 
     <item name="android:layout_width">match_parent</item> 
     <item name="android:layout_height">wrap_content</item> 
     <item name="android:clickable">true</item> 
    </style> 
    <style name="MyActionBar" 
     parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse"> 
     <item name="android:background">@color/material_dark_blue</item> 
     <item name="android:displayOptions">showHome|homeAsUp|showTitle</item> 
     <item name="android:icon">@android:color/transparent</item> 
     <item name="android:centerX">@android:integer/config_shortAnimTime</item> 
     <item name="windowActionBar">false</item> 
    </style> 
    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
     <item name="android:textColor">@color/material_white</item> 
     <item name="android:popupMenuStyle">@style/CustomOverflowBack</item> 
     <item name="android:itemTextAppearance">@android:color/white</item> 
    </style> 

Manifest:

<application 
     android:name=".MyApplication" 
     android:allowBackup="true" 
     android:hardwareAccelerated="false" 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 

Jede Hilfe sehr geschätzt wird.

UPDATE: Hinzufügen CustomOverflowBack:

<style name="CustomOverflowBack" parent="@android:style/Widget.Holo.Light.ListPopupWindow"> 
     <item name="android:popupBackground">@drawable/menu_item</item> 
    </style> 

Menu_item.xml

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/listview_background_shape"> 

    <stroke android:width="1dp" android:color="@color/material_dark_blue" /> 
    <solid android:color="@color/actionbar_item_bg_color" /> 

</shape> 
+0

Haben Sie versuchen, meine Antwort @ Tom11 –

+0

your style "CustomOverflowBack" angegeben in schreiben: @ color @ style/CustomOverflowBack SachinS

+0

einfach < "Hintergrund android" item name => entfernen/material_dark_blue – Sheychan

Antwort

2

Ersetzen Sie diese

<style name="toolbarButton"> 
    <item name="android:layout_width">match_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:clickable">true</item> 
</style> 
<style name="MyActionBar" 
    parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse"> 
    <item name="android:background">@color/material_dark_blue</item> 
    <item name="android:displayOptions">showHome|homeAsUp|showTitle</item> 
    <item name="android:icon">@android:color/transparent</item> 
    <item name="android:centerX">@android:integer/config_shortAnimTime</item> 
    <item name="windowActionBar">false</item> 
</style> 
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="android:textColor">@color/material_white</item> 
    <item name="android:popupMenuStyle">@style/CustomOverflowBack</item> 
    <item name="android:itemTextAppearance">@android:color/white</item> 
</style> 

<style name="CustomOverflowBack" parent="@android:style/Widget.Holo.Light.ListPopupWindow"> 
    <item name="android:popupBackground">@drawable/menu_item</item> 
</style> 

mit diesem:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="actionBarPopupTheme">@style/AppThemeOverlay.Popup</item> 
</style> 

<style name="AppThemeOverlay.Popup" parent="ThemeOverlay.AppCompat.Dark"> 
    <item name="android:colorBackground">popup menu background color</item> 
    <item name="colorControlHighlight">selected item color</item> 
</style> 

Hier ist, wie Sie es verwenden:

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?actionBarSize" 
    android:background="?colorPrimary" 
    android:elevation="4dp" 
    app:popupTheme="?actionBarPopupTheme"/> 

Die oben genug ist, um es auf API 21 und oben zu arbeiten.

Ich habe Ihre toolbarButton Stil weggelassen, weil es nichts mit dem Problem zu tun hat.

Hier sind einige Hinweise

<style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse"> 

Nicht Plattform Stile für AppCompat Widgets verwenden. Wenn Sie den AppCompat-Stil @style/Widget.AppCompat.ActionBar verwendet haben, müssten Sie praktisch keine der Attribute überschreiben.

<item name="android:background">@color/material_dark_blue</item> 

Hintergrund in einem Design wird auf jede Ansicht angewendet, die es nicht überschreibt. Deshalb siehst du das blaue Quadrat. android:background ist ein Stil Attribut, verwenden Sie es auf Widgets. android:colorBackground ist ein Thema Attribut und es wird (unter anderem) verwendet, um die android:popupBackground Farbe, die die Form eines Popup-Menüs bietet.

<item name="android:textColor">@color/material_white</item> 

Textfarbe ist wieder mehr ein Stilattribut, das in TextViews verwendet wird. Weit verbreitete Themenattribute sind android:textColorPrimary und android:textColorSecondary. Benutze diese stattdessen. android:textColor in einem Thema kann zu unerwarteten/unerwünschten Ergebnissen führen.

<item name="android:itemTextAppearance">@android:color/white</item> 

Sie NICHT setzen eine Farbressource in eine Art/Text Aussehen-Attribut. Es wird nicht funktionieren oder abstürzen oder schlimmere unerwartete Ergebnisse ohne Absturz erzeugen.

+0

Mit diesem Ansatz gibt es standardmäßig dunkelgraue Farbe, aber ich brauche es blau. ColorBackground und colorControlHighlight scheint nicht zu funktionieren.Ich habe deinen Code benutzt, allerdings habe ich die App geändert: popupTheme zu android: popupTheme, als App: warf mir einen Fehler (Namespace ist nicht gebunden). – Tom11

+0

@ Tom11 Wir schreiben nicht 'app:' oder 'android:' Zum Spaß gibt es einen Unterschied, und wenn Sie etwas ändern, wird es brechen. Wenn der Namespace nicht gefunden werden konnte, wählen Sie den unterstrichenen Satz aus, drücken Sie Alt + Eingabetaste und wählen Sie den Quickfix 'Create namespace declaration'. –

+0

Vielen Dank! Jetzt funktioniert es :) – Tom11

4

@ Tom11 Sie einen benutzerdefinierten Stil müssen erklären Sie Overlay von Symbolleiste Popup.

einen Stil erstreckt ThemeOverlay erstellen:

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"> 
    <item name="android:colorBackground">@color/colorPrimaryDark</item> 
    <item name="colorControlHighlight">@color/colorAccent</item> 
</style> 

In oben Stil ersetzen @ color/colorPrimaryDark mit Ihrer Hintergrundfarbe und @ Farbe/colorAccent mit Ihrer ausgewählten Hintergrundfarbe.

Dann verwenden Sie es in Ihrer Symbolleiste Deklaration.

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    style="@style/toolbarButton" 
    app:popupTheme="@style/AppTheme.PopupOverlay"/> 

Dies wird Ihr Problem beheben.

Update: Sie folgende Änderungen:

  1. ändern android:background="?attr/colorPrimary"-android:background="@color/material_dark_blue" mit der Aktionsleiste Hintergrundfarbe in über Symbolleiste Element.

  2. Entfernen Sie <item name="android:background">@color/material_dark_blue</item> aus Ihrem MyActionBar-Stil.

So ist die aktualisierte Code für Symbolleiste und MyActionBar Stil werden folgende:

<android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="@color/material_dark_blue" 
      style="@style/toolbarButton" 
      app:popupTheme="@style/AppTheme.PopupOverlay" 
      app:theme="@style/MyActionBar"/> 

<style name="MyActionBar" 
      parent="Widget.AppCompat.ActionBar"> 
     <item name="android:displayOptions">showHome|homeAsUp|showTitle</item> 
     <item name="android:icon">@android:color/transparent</item> 
     <item name="android:centerX">@android:integer/config_shortAnimTime</item> 
     <item name="windowActionBar">false</item> 
    </style> 

Dieses endlich funktionieren sollte.

+0

Das funktioniert nicht, die Farben sind immer noch gleich. – Tom11

+0

Dies würde funktionieren, wenn @ Tom11 "android: background" in einer Themenressource nicht überschreiben würde. –

+0

'MyActionBar' ist ein * style * kein * theme *. Bitte lerne den Unterschied und benutze sie entsprechend. Start hier https://chris.banes.me/2014/11/12/theme-vs-style/ –

Verwandte Themen