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