Android 4.3 메뉴 항목 showAsAction =“always”무시 됨


116

Android 4.3 (API 레벨 18)부터 사용할 수있는 새로운 v7 appcompat 라이브러리를 사용하고 있습니다.

메뉴 항목에 대해 showAsAction에 지정된 내용에 관계없이 표시되지 않습니다. 항상 오버플로 메뉴 아이콘을 만들고 메뉴 아래에 단일 메뉴 항목도 배치합니다.

다음과 같은 활동에 메뉴를 추가하려고합니다.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_sizes, menu);
    return true;
}

그리고 여기 내 메뉴 xml이 있습니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

새로운 지원 라이브러리 v7의 버그입니까, 아니면 코드에 문제가 있습니까? 이전에 ActionBarSherlock과 유사한 코드를 여러 번 사용했습니다.


2
정보 제공을 위해- "... "always"권장하지 않습니다. 사용 "ifRoom"하고 OS가 결정하도록하는 것이 좋습니다 ."
ChiefTwoPencils

답변:


313

아마도 필요한 네임 스페이스가 누락되었을 것입니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:[yourapp]="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        [yourapp]:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

[yourapp]앱 이름이나 마음이 원하는 네임 스페이스로 모든 곳에서 교체 하세요.

확인해야 할 기타 사항 :

  • 활동 클래스가 확장되는지 확인하십시오. ActionBarActivity

문제가 지속되는지 확인하십시오.


Android 참조 문서 : 작업 버튼 추가 . 다음은 관련 텍스트입니다.

앱이 Android 2.1 이하 버전에서 호환성을 위해 지원 라이브러리를 사용하는 경우 android : 네임 스페이스에서 showAsAction 속성을 사용할 수 없습니다. 대신이 속성은 지원 라이브러리에서 제공되며 사용자 고유의 XML 네임 스페이스를 정의하고 해당 네임 스페이스를 속성 접두사로 사용해야합니다. (사용자 지정 XML 네임 스페이스는 앱 이름을 기반으로해야하지만 원하는 이름이 될 수 있으며 선언 한 파일 범위 내에서만 액세스 할 수 있습니다.)


2
그게 제가 알아 낸 것이기도합니다. 감사합니다-확실히 받아 들였습니다. 그러나 showAsAction은 해당 사용자 정의 네임 스페이스를 사용해야합니다.
Mcingwe 2013

5
'yourapp'은 String.xml <string name = "app_name"> yourapp </ string>에서 의미합니까?
LOG_TAG

4
누군가 이것이 왜 작동하는지 설명 할 수 있습니까? 사용자 정의 네임 스페이스를 확장해야하는 이유는 무엇입니까? 약간 혼란 스럽습니다.
dineth

8
@dineth appcompat는 라이브러리 프로젝트로 사용됩니다. 즉, 모든 리소스 (문자열, 드로어 블, 속성 ...)가 android 네임 스페이스 대신 애플리케이션 네임 스페이스에서 선언됩니다. 는 AS showAsAction속성이 안드로이드-7에 존재하지 않았다, 당신은 앱 네임 스페이스를 사용해야합니다
nicopico

22
누구나 "사용자 정의 네임 스페이스"또는 "앱과 일치하는 네임 스페이스"라고 말합니다. 그러나 네임 스페이스는 항상 http://schemas.android.com/apk/res-auto모든 예에 있습니다. 그것은 사용자 정의 또는 앱과 일치하는 것이 아닙니다. 이것이 문서의 실제 네임 스페이스입니다. 모든 사람이 사용자 지정 접두사를 의미한다고 생각하며 실제로 원하는대로 사용할 수 있습니다. 이것이 사실입니까?
Andrew Arnott

52

나 자신을 알아 냈다. 지원 라이브러리 v7에서 showAsAction은 다음과 같은 사용자 정의 네임 스페이스 아래에 있어야합니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:balloonberry="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        balloonberry:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>

1
'balloonberry'는 String.xml에서 "<string name ="app_name "> balloonberry </ string>"을 의미합니다. 맞습니까?
LOG_TAG

5
@LOG_TAG-아니요, 위에 입력 한 그대로 여야합니다. 이것은 문자열이 아니라 네임 스페이스입니다.
BeccaP 2013-10-28

오 ... errr 지원 V4에 미치는 확인 V7 지원
Yasitha Waduge

설명 Mcingwe 주셔서 감사합니다
Sachidananda Naik는

32

또한 ActionBarActivity.onCreateOptionsMenu () 메서드에서 올바른 인플레이터를 사용하는지 확인하십시오.

올바른 솔루션 :

MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_example, menu);

잘못된 해결책 :

MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu_example, menu);

1
위의 모든 답변과 stackoverflow에 대한 또 다른 답변을 전달했지만 내가 놓친 유일한 것은 getMenuInflater () 답변입니다. 공유 해주셔서 감사합니다.
Amt87 2015

이것에 대해 정말 감사합니다. 100 개 이상의 메뉴를 모두 사용자 정의 네임 스페이스를 사용하도록 변환했는데 1 개의 stinkin '화면이 여전히 작동하지 않았습니다. 1 개의 활동이 getMenuInflater () 대신 "new MenuInflater"를 사용하고있는 것으로 나타났습니다. 정말 감사합니다!
DiscDev

이건 매우 중요합니다. menuInflater 생성 (2 방향)을 사용하고있었습니다. 감사합니다
wtk

24

대한 조각

사용자 정의 네임 스페이스가있는 메뉴는 showAsAction이 표시 되지 않도록 합니다.

showAsAction에 "android :"접두사를 사용하면 Android Studio 에서 사용자 지정 네임 스페이스 를 사용해야한다고 언급하더라도 작동 합니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add_checkin"
          android:title="Add Checkin"
          android:orderInCategory="10"
          android:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add"/>
</menu>

이것은 차이가있을 경우를 대비하여 Android SDK 22 및 Support v4 조각을 사용하고 있습니다.


이것이 내 문제를 해결 한 유일한 방법입니다 (이 오류가 표시되지만). 감사 !
user2630165 2015-10-30

3
<item> 내의 tools : ignore = "AppCompatResource"를 사용하여 XML 레이아웃의 오류 / 경고를 억제 할 수 있습니다. 여기 문서 : tools.android.com/tips/lint/suppressing-lint-warnings
베이커

귀하의 답변과 Anton Kizema가 저에게 적합한 솔루션입니다. 또한 팁을 주셔서 감사합니다 tools:ignore.
hata

16

같은 문제가 발생했지만 Android 5에서는 3 개의 항목이 있지만 OS는 내 속성 "항상"을 무시하고 2 개의 항목 만 표시했습니다. 여기 내 솔루션 :

  @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu()");
    inflater.inflate(R.menu.your_menu, menu);
    for (int j = 0; j < menu.size(); j++) {
        MenuItem item = menu.getItem(j);
        Log.d(TAG, "set flag for " + item.getTitle());
        item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
    }
}

1
setShowAsActionFlags()API 14가 필요하지만 여전히 저에게 가장 적합한 솔루션이었습니다.
미스터 벙글

6

또한 네임 스페이스에 대한 올바른 경로가 있는지 확인하십시오. 잘못된 경우 오류 메시지가 표시되지 않습니다.

나는 가지고 있었다

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/res-auto">

대신에

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/apk/res-auto">

내가 아는 것은 작동하지 않는다는 것뿐이었습니다. 경로의 / apk 부분을 어떻게 잊었는지 확실하지 않지만 발생했습니다. 오류 메시지가 없으며 추적하기 어려운 버그입니다.


6

제 경우에는 앱의 build.gradle 컴파일 'com.android.support:appcompat-v7:21.0.3'에서 제거해야했습니다.

주의 : 내 min sdk = 14이고 android studio에서 만든 프로젝트가 내 비정상적인 의존성을 삽입했습니다.

이 교체 후에 android : showAsAction = "always"를 작성할 수 있습니다.


저를 해결해 주셔서 감사합니다! 4.0 이전의 Android 버전을 지원할 필요가 없기 때문에 오늘날 대부분의 경우 최상의 솔루션 일 수 있습니다.
pinyin_samu

귀하의 답변과 Baker 's가 저에게 적합한 솔루션입니다.
hata

4

이것은 귀하의 경우가 아닐 수도 있지만

new MenuInflater(this).inflate(R.menu.my_menu, menu);

그것을 변경

getMenuInflater().inflate(R.menu.my_menu, menu);

문제를 해결했습니다!


0
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <item
        android:id="@id/back"
        android:icon="@drawable/back"
        app:showAsAction="always"
        android:title="@string/back"/>
    <item
        android:id="@id/save"
        android:icon="@drawable/le_top_btn_icon_add"
        app:showAsAction="ifRoom"
        android:title="@string/save"/>
</menu>

작동하지 않음, supportLibraryVersion = '25 .1.0 'compileSdkVersion = 25

"경고"를 참조하십시오.

xmlns : app = "http://schemas.android.com/apk/res-auto"less ... (Ctrl + F1)와 함께 appcompat 라이브러리와 함께 app : showAsAction을 사용해야합니다.

appcompat 라이브러리를 사용할 때 메뉴 리소스는 android : 네임 스페이스가 아닌 app : 네임 스페이스의 showAsAction을 참조해야합니다.

마찬가지로 appcompat 라이브러리를 사용하지 않는 경우 android : showAsAction 속성을 사용해야합니다.

경고는 무시할 수 있다고 생각합니다.


0

showAsAction 및 actionViewClass에 다음과 같은 사용자 정의 네임 스페이스를 추가합니다.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.widget.SearchView" />


0

교체하여 해결했습니다.

android:showAsAction="ifRoom"

app:showAsAction="ifRoom"

그것은 menuitme xml입니다.

<item android:id="@+id/action_refresh"
      android:title="Refresh"
      android:icon="@drawable/refresh2"
      app:showAsAction="ifRoom" />

0

가장 간단한 방법은 다음을 추가하여 코드를 수정하는 것입니다.

xmlns:app="http://schemas.android.com/apk/res-auto"

이 코드를 변경

android:showAsAction="always"

app:showAsAction="always"

그리고 마지막으로

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_add_size"
        android:title="@string/menu_add_item"
        android:orderInCategory="10"
        app:showAsAction="always"
        android:icon="@android:drawable/ic_menu_add" />
</menu>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.