Android 작업 표시 줄에 오버플로가 표시되지 않음


90

내 앱에 3 개의 항목이있는 작업 표시 줄이 있습니다.

공간 문제로 인해 2 개만 표시 될 수 있으므로 첫 번째는 표시되고 나머지는 오버플로에 표시 될 것으로 예상합니다. 그러나 실제로는 처음 2 개 항목 만 표시되며 감지 할 수있는 오버플로가 없습니다.

다음은 관련 코드입니다. list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

Activity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}

120
기기에 메뉴 버튼이있는 경우 오버플로 아이콘이 표시되지 않습니다. 어떤 장치를 사용하고 있습니까?
Reinier 2015 년

1
테스트중인 가상 장치에는 실제로 메뉴 버튼이 있으며 클릭하면 누락 된 항목이 표시됩니다. 감사합니다!
Mats Raemen 2012 년

2
@Reinier 저는 ActionBarSherlock을 사용하고 있습니다. 2.3을 실행하는 Galaxy Ace에서는 표시되지만 4.0을 실행하는 Galaxy SII에서는 표시되지 않습니다. 둘 다 HW 메뉴 버튼이 있습니다.
Mister Smith

2
나는 이것이 내가 Galaxy Note II가 아닌 nexus 7 구매에 오버플로 아이콘을 가지고 있다는 것을 당황스럽게 만들었다는 것을 확인하고 싶었습니다. 노트에는 메뉴 버튼이 있습니다. 감사!
bsautner 2013

@Reinier 동일한 문제에 직면하여 어떻게해야합니까?
rupesh

답변:


125

장치 메뉴 버튼에 상관없이 세 개의 점을 보여주고 싶다면! 그런 다음 응용 프로그램 클래스의 onCreate 메서드에서이 메서드를 호출 할 수 있습니다.

private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

32
이것은 플랫폼의 나머지 앱과의 일관성을 깨는 끔찍한 해킹입니다. 이러지 마세요.
adamp

19
이것은 두 가지 악 중 더 작은 것 같습니다. 현재 행동은 용납 할 수 없습니다.
biorbnA 2013 년

6
오버플로를 허용하는 좋은 방법이며 메뉴 하드 키는 더 이상 허용되지 않습니다.
Necronet 2013

5
잘 작동합니다! 사용자가 하드웨어 메뉴 버튼 (훌륭함)을 눌러도 작동하지만 메뉴 사운드 효과는 두 번 들립니다 .. 누구든지 한 번만 소리를내는 방법을 알고 있습니까?
Bruce

5
이것은 해킹이 아닙니다. 개발자는 Android에서 2 + 2가 아니기 때문에 무엇을 해킹이라고 부르는지 알아야합니다. Reflection은 Java 메커니즘을 사용하여 시간을 절약합니다. 그렇지 않으면 24/7 내부 클래스에 컨텍스트를 전달하거나 AOSP를 무한대로 사용자 정의 할 수 있습니다. 나에게이 솔루션은 순수 주의자들이 깨끗하다고 ​​생각하는 것을 위해 수많은 AOSP 사용자 지정 콘텐츠 및 연결된 개인 연결을 재정의하고 포함해야하는 문제를 해결합니다. 작은 목록에 대해 FASTSCROLL을 일관되게 활성화 할 수 없다는 것을 알고 계셨습니까? 리플렉션을 사용하기 전에 한 문자 편집을 위해 10 개 이상의 AOSP 리소스를 복사해야했습니다.
leRobot

54

액션 바

res / menu / menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

}

액션 바 아이콘 세트 다운로드


2
@Reinier 댓글을 살펴보면 "기기에 메뉴 버튼이 있으면 오버플로 아이콘이 표시되지 않습니다"라는 말이 사실입니다.
Ahmad Dwaik 'Warlock'2013

메뉴 버튼이있는 장치에서 테스트했는데 제 경우에는 오버플로가 표시됩니다. 내가 사용하는 android:showAsAction="always"많은 항목에 대한
Kirit Vaghela에게

어떤 장치에서 테스트 했습니까? 나는 neo v xperia와 s #를 사용했습니다
Ahmad Dwaik 'Warlock'dec

1
참고 : 귀하의 항목을 "항상"= 당신의 오버 플로우 메뉴 MUST의 showAsAction을 팽창
Kirit Vaghela

1
showAsAction은 이전 SDK의 android 네임 스페이스에서 사용할 수 없습니다. 이 문제를 극복하려면 developer.android.com/training/basics/actionbar/… 링크를 따르세요 . 이 NS를 추가 한 후 schemas.android.com/apk/res-auto을 , 위의 트릭은 나를 위해 완벽하게 잘 작동
chedine

42

나는 이것이 오버플로 메뉴가 아니라는 것을 알고 있지만 비슷합니다. 좋아요, 이것은 간단하지만 알아 내기 어려웠습니다.

먼저 오버플로 팽창기로 사용하려는 메뉴 항목이 필요합니다. 예

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

항목이 있으면 더보기 메뉴에서 원하는 항목이 포함 된 하위 메뉴를 추가하세요. 예:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

클릭하면 다른 항목이 팽창합니다. 내 응용 프로그램은 ActionBarSherlock 4.0을 사용하고 있으므로 이것이 작동하기 전에 "SplitActionBar"에 액세스해야합니다. (기본 Android Actionbar에서 계속 작동합니다)

방법은 다음과 같습니다. AndroidManifest.xml 파일에서 오버플로 메뉴가 필요한 활동 아래에이 코드를 추가해야합니다.

android:uiOptions="splitActionBarWhenNarrow"

참고 : 오버플로 메뉴를 부 풀리는 항목은 반드시showAsAction="always"

Vwola! 오버플로 메뉴가 있습니다! 내가 당신을 도왔기를 바랍니다. :)


3
메뉴 버튼 해킹보다 좋은 솔루션입니다.
ol0

26

하드웨어 메뉴 버튼이있는 기기 (Galaxy S3, 삼성처럼 완고함 ...)에서 오버플로 메뉴는 하드웨어 메뉴 버튼을 사용하여 '전통적인'메뉴처럼 작동합니다.


2
그러나 호환성 라이브러리의 이전 답변은 매우 이상한 결과를 발견했습니다. 하드웨어 버튼이있는 3 개의 장치, Note 3 Neo = 오버플로 메뉴가 표시됨, 메뉴 버튼이 작동하지 않음, 참고 1 = 오버플로 없음, 메뉴 버튼이 작동 함, Galaxy S3, 아니요 오버플로, 메뉴 버튼이 작동하지 않습니다! 미친 짓이야.
3c71 2014

5

"오버플로"메뉴라고 말하면 끝에 더 많은 항목이 있음을 나타 내기 위해 마지막에 표시되는 세 개의 점을 의미합니까 ... 아니면 오버플로 항목에 대해 하단에 표시되는 분할 작업 표시 줄을 의미합니까?

분할 작업 표시 줄을 의미하는 경우이를 활동의 매니페스트 파일에 추가해야합니다.

android:uiOptions="splitActionBarWhenNarrow"

기본적으로 점 3 개 오버플로 메뉴는 자동으로 실행되어야하므로 위에서 제공 한 정보로는 문제가 무엇인지 알기가 어렵습니다.


나는 세 개의 점을 의미합니다. 그것은 순서의 항목 변경이 표시됩니다 처음 2 개 아이콘입니다 때마다 있기 때문에, 때문에 항목으로처럼 아니에요
매트 Raemen

실제 문제를 파악하기 위해 추가 정보를 제공해야합니까?
Mats Raemen 2012 년

minSdkVersion, targetSdkVersion 및 테스트중인 버전은 무엇입니까?
Sparky 2012 년

5
기기에 메뉴에 대한 물리적 버튼이 있습니까? 아니면 갤럭시 넥서스 폰과 같은 가상 버튼입니까? 휴대 전화에 물리적 버튼이없는 경우에만 세 개의 점이 표시 될 것입니다.
wnafee

5

actionbarcompat에서 액션 오버플로 (점 3 개)를 항상 표시하려면 :
메뉴 파일에서 예 :
main.xml

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

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

활동 파일에서 :

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

나를 위해 잘 작동했습니다.
Google Nexus S, Samsung S3에서 테스트되었습니다.


3

메뉴 버튼이있는 기기에서 오버플로 메뉴가 ActionBar에 표시되지 않는 것 같습니다. 또한 API 레벨 14 이전에 기기에 하드웨어 메뉴 버튼이 있는지 알 수있는 방법이 없습니다. (4.0 이상) .

이 솔루션 android.support.v7.app.ActionBar은 이전 Honeycomb (<3.0)에서만 표준 옵션 메뉴를 여는 오버플로 버튼을에 추가하고 그렇지 않으면 시스템에 남겨 둡니다. 어떤 경우 든 always또는 ifRoom모든 작업에 대해 선택할 수 있습니다 .

Action Bar Icon Pack 에서 오버플로 아이콘을 가져옵니다 .

메뉴 추가 (제목, 주문 등 관련없는 부분 생략)

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

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

3.0 이상에서 오버플로 작업 제거

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

마지막으로 Activity.openOptionsMenu()오버플로 작업에서 호출 합니다.

어 ... 아니. openOptionsMenu()메뉴 버튼에서 호출 할 수는 없지만 AndroidAnnotations 를 사용하는 경우 쉽게 수행 할 수 있습니다.

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

이런 식으로하면 안된다면

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}


2

넣어 xmlns:your_app_name="http://schemas.android.com/apk/res-auto"대신 메뉴 태그 안에 android:showAsAction="always"사용your_app_name:showAsAction="always"

예를 들어

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.