3

참고 : 내가 시간을 검색하고 이미 유래에 의해 를 제공하는 모든 솔루션을 시도했다.변경 팝업 메뉴 배경색

테마 오버레이를 연구 중입니다. 액션 바 아이콘을 클릭하면 팝업 메뉴가 열리는 샘플 앱을 만들었습니다. 여기 내거야 styles.xml

<resources> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
     <!-- Customize your theme here. --> 
     <item name="colorPrimary">@color/colorPrimary</item> 
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
     <item name="colorAccent">@color/colorAccent</item> 

    </style> 

    <style name="AppTheme.NoActionBar"> 
     <item name="windowActionBar">false</item> 
     <item name="windowNoTitle">true</item> 
    </style> 



    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Light"> 
     <item name="android:textColorPrimary">@color/colorAccent</item> 
    </style> 

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"> 
     <!-- added all to see which one will work.--> 
     <item name="android:popupMenuStyle">@style/PopupMenu</item> 
     <item name="android:itemBackground">@color/colorAccent</item> 
     <item name="android:colorBackground">@color/colorAccent</item> 

    </style> 

    <style name="PopupMenu" parent="@android:style/Widget.PopupMenu"> 
     <item name="android:popupBackground">@color/colorAccent</item> 
    </style> 

</resources> 

그리고 여기 내 도구 모음 스타일입니다.

<android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

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

    </android.support.design.widget.AppBarLayout> 

은 내가 내 styles.xml에있는 하나에 popupTheme 설정했습니다. 이제 배경색 팝업 메뉴를 변경하고 싶습니다. 현재는 흰색입니다. 여기

enter image description here

는 코드입니다.

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     if(item.getItemId() == R.id.standard_menu){ 
      showPopupMenu(item); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void showPopupMenu(MenuItem item) { 
     PopupMenu p = new PopupMenu(this, findViewById(item.getItemId())); 
     p.inflate(R.menu.pop_menu); 
     p.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       Toast.makeText(MainActivity.this, "clicked.", Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
     }); 
     p.show(); 
    } 
+0

은 "안드로이드 popupMenuStyle는"당신은 '<항목 이름 = "popupMenuStyle"> @ 스타일/PopupMenu를'를 시도? – Karakuri

+0

예. 작동하지 않습니다. – mallaudin

+0

여기를 참조하십시오 : http://www.silverbaytech.com/2013/05/27/themes-for-the-android-actionbar-actionbaritems/ –

답변

15

처럼 PopupOverlay 내부 colorPrimary를 사용하는이 작품 희망 삽입 그 이유는 실제로 OP가 맞춤형 팝업 스타일이 적용되지 않는 이유를 설명하지 않았기 때문에 받아 들여지는 답변에 만족합니다. 배경뿐만 아니라 th e 텍스트 색상 - 그래서 나는 내 자신의 실험을했습니다.

Toolbar (메뉴 항목이있을 때)에 의해 생성 된 팝업과 PopupMenu으로 자신을 보여주는 팝업간에 차이가 있다는 점에 유의해야합니다. 이들은 서로 다른 테마 속성에 의해 관리됩니다. 또한 및 android.support.v7.widget.PopupMenu이라는 두 개의 PopupMenu 클래스가 있습니다.

명시 적으로 표시 할 PopupMenu의 스타일을 지정해야하는 테마 속성은 android:popupMenuStyle 또는 popupMenuStyle입니다. 당신은 당신의 사용자 정의 스타일의 적절한 응용 프로그램을 달성하기 위해 몇 가지 옵션이 있습니다

(1) 활동 (또는 앱)

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- if using android.widget.PopupMenu --> 
    <item name="android:popupMenuStyle">@style/PopupMenu</item> 
    <!-- if using android.support.v7.widget.PopupMenu --> 
    <item name="popupMenuStyle">@style/PopupMenu</item> 
</style/> 

<style name="PopupMenu" parent="ThemeOverlay.AppCompat.Dark"> 
    <item name="android:popupBackground">@color/popupBackground</item> 
</style> 

PopupMenu popup = new PopupMenu(this, anchorView); 

주의 테마에 사용 android:popupMenuStyle이 레이아웃에 추가 아무것도 필요하지 않습니다 파일.

(2)는 ContextThemeWrapper에게 ContextThemeWrapper를 구성 할 때이 직접 R.style.PopupMenu를 사용하지 않는 방법

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- nothing special --> 
</style/> 

<style name="CustomPopupTheme" parent="ThemeOverlay.AppCompat.Dark"> 
    <!-- if using android.widget.PopupMenu --> 
    <item name="android:popupMenuStyle">@style/PopupMenu</item> 
    <!-- if using android.support.v7.widget.PopupMenu --> 
    <item name="popupMenuStyle">@style/PopupMenu</item> 
</style> 

<style name="PopupMenu" parent="ThemeOverlay.AppCompat.Dark"> 
    <item name="android:popupBackground">@color/popupBackground</item> 
</style> 

ContextThemeWrapper ctw = new ContextThemeWrapper(this, R.style.CustomPopupTheme); 
PopupMenu popup = new PopupMenu(ctw, anchorView); 

주를 사용합니다. 이것은 조금 어색하지만 잠재적으로 팝업 테마를 활동 또는 앱 테마와 분리하여 유지하려는 경우 유용합니다 (예 : 일부 팝업 만 특수 테마를 필요로 함). 이미 AppBar의 테마 오버레이를 가지고 있기 때문에

(3) 사용하여 AppBarLayout의 문맥

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <!-- nothing special --> 
</style/> 

<style name="AppBarOverlay" parent="ThemeOverlay.AppCompat.Light"> 
    <!-- if using android.widget.PopupMenu --> 
    <item name="android:popupMenuStyle">@style/PopupMenu</item> 
    <!-- if using android.support.v7.widget.PopupMenu --> 
    <item name="popupMenuStyle">@style/PopupMenu</item> 
</style> 

<style name="PopupMenu" parent="ThemeOverlay.AppCompat.Dark"> 
    <item name="android:popupBackground">@color/popupBackground</item> 
</style> 

<style name="PopupOverlay" parent="ThemeOverlay.AppCompat.Dark"> 
    <!-- changes the background of the Toolbar's popup --> 
    <item name="android:colorBackground">@color/popupBackground</item> 
</style> 


<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppBarOverlay"> 

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

</android.support.design.widget.AppBarLayout> 


AppBarLayout appBar = (AppBarLayout) findViewById(R.id.app_bar); 
PopupMenu popup = new PopupMenu(appBar.getContext(), anchorView); 

, 당신은 당신의 팝업 테마 참조를 유지하는 데 사용할 수 있습니다. app:popupThemePopupMenu이 아닌 Toolbar의 팝업에 영향을 미치므로 여기에는 실제로 관련이 없습니다.하지만 현재의 레이아웃을 고려할 때 툴바의 컨텍스트에서 작동합니다. 나는 PopupOverlay 스타일 android:colorBackground의 장소에 사용하는 경우, android:itemBackground 만 일) 내 실험에서

, 또한이 어떤해야 android:theme 속성은 후드 아래에 어떻게 작동하는지에 대한 단서를, 위의 옵션 2에 얼마나 유사한주의 . 그러나 android:colorBackground을 사용하면 팝업 창의 창 색상이 변경되고 항목의 둥근 모서리와 선택 가능한 항목 강조 표시/잔물결이 그대로 유지되므로 더 바람직합니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 나는 그것을 적용 할 것이고 당신의 대답을 받아 들일 것이다. – mallaudin

+0

완벽한! 그것을 찔렀다. – mallaudin

+0

옵션 2 : 나에게 딱! – Nick

0

는 AppTheme를 통해 UR하기는 PopupMenu 스타일을 추가

<style name="AppTheme" parent="android:Theme.Light"> 
    <item name="android:popupMenuStyle">@style/PopupMenu</item> 
</style> 

<style name="PopupMenu" parent="@android:style/Widget.PopupMenu"> 
    <item name="android:popupBackground">@android:color/white</item> 
</style> 

manifest.xml : 내가 그것을 작동 희망

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

합니다.

+0

댓글이 보이지 않습니까? 나는 이미 이것을 시도했다. – mallaudin

1

이 날

<item name="android:itemBackground">@color/primary</item> 

근무 주 스타일 에 당신이

+0

예. 작동하지만 다른 옵션이 작동하지 않는 이유는 무엇입니까? – mallaudin

+1

혼란스러워. OP의 이미지는 전체 팝업 스타일이 적용되지 않았 음을 나타냅니다. 'PopupOverlay'는'ThemeOverlay.AppCompat.Dark'를 확장했기 때문에 텍스트 색상은 가볍지 만 분명하지는 않습니다. 팝업의 배경만으로 해결할 수 있지만 실제로 정의 된 사용자 정의 스타일이 적용되지 않는 이유에 대해서는 실제로 대답하지 않습니다. – Karakuri

0

시도 '나는 년후이

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" > 
    <item name="colorPrimary">@color/blue_ivy</item> 
</style> 
+0

nope. 작동하지 않습니다. – mallaudin

1

사용 지원 V7 라이브러리의 PopupMenu를위한 "popupMenuStyle"및 사용 : 일반 PopupMenu를