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

내 앱에 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;
}



답변

장치 메뉴 버튼에 상관없이 세 개의 점을 보여주고 싶다면! 그런 다음 응용 프로그램 클래스의 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());
    }
}


답변

액션 바

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);
    }

}

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


답변

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

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

<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! 오버플로 메뉴가 있습니다! 내가 당신을 도왔기를 바랍니다. 🙂


답변

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


답변

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

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

android:uiOptions="splitActionBarWhenNarrow"

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


답변

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에서 테스트되었습니다.


답변

메뉴 버튼이있는 기기에서 오버플로 메뉴가 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();
        }
    }
    );
}