답변:
오는 Get MenuItem
등의 항목을 가리키는, 전화 setVisible
거기에 그것의 가시성을 조정 한 후 호출 invalidateOptionsMenu()
액션 바 메뉴가 적절하게 조정되도록 활동에.
업데이트 : A MenuItem
는 레이아웃의 일부인 일반보기가 아닙니다. 그것은 특별하고 완전히 다른 것입니다. 귀하의 코드 반환 null
을위한 item
그리고 그 충돌의 원인. 대신 필요한 것은 다음과 같습니다.
MenuItem item = menu.findItem(R.id.addAction);
먼저 호출해야하는 순서는 다음과 같습니다. 먼저 호출 invalidateOptionsMenu()
한 다음 내부 onCreateOptionsMenu(Menu)
에서 MenuItem에 대한 참조 (을 호출하여 menu.findItem()
) setVisible()
를 가져 와서 호출 하십시오.
MenuItem
수 있습니다 . 코드와 충돌 로그를 모두 보지 않으면 알 수 없었습니다. null
getItem
findItem
onCreateOptionsMenu
해당 시점에서 항목 가시성을 설정하십시오. 또는 표시 여부를 결정할 때까지 참조를 유지하십시오.
invalidateOptionsMenu()
를 한 다음 내부 onCreateOptionsMenu(Menu)
에서 MenuItem
(에 대한 호출 menu.findItem()
)에 대한 참조를 가져와 호출 setVisible()
하는 것입니다. 답변 suhas_sm로 하고 P1r4nh4으로는 올바른 접근 방식을 제시한다.
이 질문에 대한 부록을 찾았습니다.
이동 중에 메뉴 항목의 가시성을 변경하려면 활동에서 멤버 변수를 설정하면 메뉴를 숨기고 invalidateOptionsMenu()
재정의 된 onCreateOptionsMenu(...)
메소드 에서 항목을 호출 하고 숨기고 싶다는 것을 기억해야합니다 .
//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == HIDE_MENU)
{
for (int i = 0; i < menu.size(); i++)
menu.getItem(i).setVisible(false);
}
}
이 예에서는 모든 항목을 숨겼습니다.
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
. 문서 상태 : "메뉴가 표시 되려면 true를 반환해야하며 false를 반환하면 표시되지 않습니다"
onPrepareOptionsMenu()
onCreateOptionsMenu()
한 번만 호출되므로 표시 / 숨기기 로직에 사용해야 하므로 초기화 후에 메뉴 항목을 변경하려는 경우에는 유용하지 않습니다. 따라서 onCreate에 팽창 시키지만 onPrepare에 표시 / 숨기기.
예.
invalidateOptionsMenu()
옵션을 숨기고 싶을 때 전화 하십시오. 이 호출 onCreateOptionsMenu()
됩니다.onCreateOptionsMenu()
, 플래그 / 상태 및 표시하거나위한 검사는 그것을 다음과 같은 방법을 숨길 수 :MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
invalidateOptionsMenu
대신 해서는 안 invalidateOptions
됩니까?
onCreateOptionsMenu
좀 더 문맥에 대한 답을 찾고있었습니다. 이제 알아 냈으므로 그 대답을 추가 할 것입니다.
기본적으로 공유 버튼은에서 설정 한대로 숨겨집니다 android:visible="false"
.
main_menu.xml
<?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">
<!-- hide share button by default -->
<item
android:id="@+id/menu_action_share"
android:icon="@drawable/ic_share_white_24dp"
android:visible="false"
android:title="Share"
app:showAsAction="always"/>
<item
android:id="@+id/menu_action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="Setting"
app:showAsAction="ifRoom"/>
</menu>
그러나 공유 버튼은 일부 조건에 따라 선택적으로 표시 될 수 있습니다.
MainActivity.java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_action_share);
// show the button when some condition is true
if (someCondition) {
shareItem.setVisible(true);
}
return true;
}
invalidateOptionsMenu()
하여 메뉴를 새로 고 칩니다 .
나를 위해 일하지 않았다. onPrepareOptionsMenu
항목을 보이지 않게 설정 하기 위해 명시 적으로 사용해야 했습니다.
따라서 onCreateOptionsMenu
메뉴를 만들고 onPrepareOptionsMenu
가시성 등을 변경 하는 데 사용하십시오 .
onPrepareOptionsMenu
이러한 유형의 작업을 수행하기에 적합한 장소 인 것 같습니다. "화면의 표준 옵션 메뉴가 표시되도록 준비하십시오. 메뉴가 표시 될 때마다 바로 표시됩니다. 이 방법을 사용하면 항목을 효율적으로 활성화 / 비활성화하거나 내용을 동적으로 수정할 수 있습니다. "
invalidateOptionsMenu()
하여 메뉴를 새로 고 칩니다 .
메뉴 레이아웃 파일에서 메뉴 항목 가시성을 처음에 다음과 같이 false로 설정하십시오.
<?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:visible="false"
android:id="@+id/action_do_something"
android:title="@string/txt_do_something"
app:showAsAction="always|withText"
android:icon="@drawable/ic_done"/>
</menu>
그런 다음 메뉴를 부풀린 후 onCreateOptionsMenu ()에서 메뉴 항목의 가시성을 false로 간단히 설정할 수 있습니다.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(menu,R.menu.menu);
MenuItem item = menu.findItem(R.id.menuItemId);
if (item != null){
item.setVisible(false);
}
}
이것은 활동과 조각 모두에서 나를 위해 일했습니다.
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (menu.findItem(R.id.action_messages) != null)
menu.findItem(R.id.action_messages).setVisible(false);
}
P1r4nh4 답변이 잘 작동합니다. 부울 플래그를 사용하여 단순화했습니다.
public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == 1) //1 is true, 0 is false
{
//hide only option 2
menu.getItem(2).setVisible(false);
}
}
0
하고 1
"부울 플래그"가 아닌 의사 부울입니다. 게다가 여기에 실제 부울을 사용할 이유가 없습니다.
Android 개발자 공식 사이트에 따르면 런타임시 메뉴 항목이나 아이콘, 가시성 등을 변경하기 위해 OnCreateOptionMenu (메뉴 메뉴)를 권장하지 않습니다.
시스템이 onCreateOptionsMenu ()를 호출 한 후에는 사용자가 채우는 Menu의 인스턴스를 유지하고 어떤 이유로 메뉴가 무효화되지 않는 한 onCreateOptionsMenu ()를 다시 호출하지 않습니다. 그러나 onCreateOptionsMenu ()를 사용하여 초기 메뉴 상태를 작성하고 활동 라이프 사이클 동안 변경하지 않아야합니다.
활동 라이프 사이클 동안 발생하는 이벤트를 기반으로 옵션 메뉴를 수정하려는 경우 onPrepareOptionsMenu () 메소드에서 수행 할 수 있습니다. 이 메소드는 현재 존재하는 메뉴 오브젝트를 전달하므로 항목 추가, 제거 또는 사용 안함과 같이 수정할 수 있습니다. (Fragments는 onPrepareOptionsMenu () 콜백도 제공합니다.) --AndroidDeveloper Official Site-
권장 대로이 onOptionsItemSelected (MenuItem item) 메소드를 사용하여 사용자 입력을 추적 할 수 있습니다.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.edit) {
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra(BUNDLE_KEY, mConnection);
startActivityForResult(intent, PICK_CHANGE_REQUEST);
return true;
} else if (id == R.id.delete) {
showDialog(this);
return true;
}
return super.onOptionsItemSelected(item);
}
런타임에 메뉴 항목을 변경해야하는 경우 onPrepareOptionsMenu (메뉴 메뉴) 를 사용하여 메뉴 항목 을 변경할 수 있습니다.
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
setVisible(false)
항상 표시되는 항목에 대해 세 개의 점 (메뉴 자체)을 클릭 할 때까지 사라지지 않습니다. 내가 사용하는 경우 invalidateOptionsMenu()
에 onPrepareOptionsMenu
즉시 자체를 재구성 항목,하지만 그들은 자신의 행동을 풀 (내가 어떤 항목을 클릭하면, 그것은 아무것도하지 않는다).
값을 변수로 설정하고 invalidateOptionsMenu ()를 호출하십시오.
예를 들어
selectedid=arg2;
invalidateOptionsMenu();
public boolean onPrepareOptionsMenu(Menu menu) {
if(selectedid==1){
menu.findItem(R.id.action_setting).setVisible(false);
menu.findItem(R.id.action_s2).setVisible(false);
menu.findItem(R.id.action_s3).setVisible(false);
}
else{
if(selectedid==2){
menu.findItem(R.id.action_search).setVisible(false);
menu.findItem(R.id.action_s4).setVisible(false);
menu.findItem(R.id.action_s5).setVisible(false);
}
}
return super.onPrepareOptionsMenu(menu);
}
setVisible(false)
항상 표시되는 항목에 대해 세 개의 점 (메뉴 자체)을 클릭 할 때까지 사라지지 않습니다. 내가 사용하는 경우 invalidateOptionsMenu()
에 onPrepareOptionsMenu
즉시 자체를 재구성 항목,하지만 그들은 자신의 행동을 풀 (내가 어떤 항목을 클릭하면, 그것은 아무것도하지 않는다).
메뉴에서 모든 항목의 가시성을 설정하면 앱바 메뉴 또는 오버플로 메뉴가 자동으로 숨겨집니다
예
private Menu menu_change_language;
...
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
...
menu_change_language = menu;
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(true);
return super.onCreateOptionsMenu(menu);
}
다른 조각으로 가기 전에 다음 코드를 사용하십시오.
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
https://stackoverflow.com/a/21215280/466363-Look Alterno와 Sufian의 답변
.
private Menu mMenu;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.track_fragment, menu);
mMenu = menu;
}
...
private void someMethod() {
...
if (mMenu != null) {
MenuItem item = mMenu.findItem(R.id.new_track);
if (item != null) {
item.setVisible(false);
ActivityCompat.invalidateOptionsMenu(this.getActivity());
}
}
...
}
ActivityCompat.invalidateOptionsMenu ()는 onPrepareOptionsMenu ()를 콜백하지 않습니다. 메뉴를 직접 업데이트합니다.
내 someMethod ()는 onCreateOptionsMenu () 이전에도 여러 곳에서 호출되므로 mMenu! = null을 확인해야합니다.
위의 답변과 같이 모든 작업을 수행했지만 메뉴 항목이 여전히 표시되면 고유 한 리소스 를 참조하는지 확인하십시오 . 예를 들어 onCreateOptionsMenu 또는 onPrepareOptionsMenu에서
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuOpen = menu.findItem(R.id.menu_open);
menuOpen.setVisible(false);
}
R.id.menu_open을 Ctrl + 클릭하고 하나의 메뉴 파일에만 존재하는지 확인하십시오. 이 자원이 이미 어디에서나 사용되어 활동에로드 된 경우 숨기려고 시도합니다.
하나의 명령으로 메뉴의 모든 항목을 숨기는 가장 좋은 방법은 메뉴 xml에서 "group"을 사용하는 것입니다. 오버플로 메뉴에있는 모든 메뉴 항목을 같은 그룹에 추가하십시오.
이 예제에는 항상 표시되는 두 개의 메뉴 항목 (일반 항목 및 검색)과 세 개의 오버플로 항목이 있습니다.
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/someItemNotToHide1"
android:title="ITEM"
app:showAsAction="always" />
<item
android:id="@+id/someItemNotToHide2"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="Search"/>
<group android:id="@+id/overFlowItemsToHide">
<item android:id="@+id/someID"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID2"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID3"
android:orderInCategory="1" app:showAsAction="never" />
</group>
</menu>
그런 다음 활동 (onCreateOptionsMenu에서 선호)에서 setGroupVisible 명령을 사용하여 모든 메뉴 항목 가시성을 false 또는 true로 설정하십시오.
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
활동의 다른 곳 에서이 명령을 사용하려면 메뉴 클래스를 로컬에 저장하고 createOptionsMenu 전에 실행할 수 있기 때문에 메뉴가 null인지 항상 확인하십시오.
Menu menu;
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
}
public void hideMenus() {
if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Appcompat 라이브러리를 사용하는 사용자의 경우 : 활동이 ActionBarActivity 서브 클래스 인 경우 supportInvalidateOptionsMenu ()를 호출 할 수 있습니다.
여기에서 볼 수 있습니다 : https://stackoverflow.com/a/19649877/1562524
더 나은 방법은 메뉴에 멤버 변수를 사용하고 onCreateOptionsMenu ()에서 초기화 한 다음 옵션 메뉴를 무효화하지 않고 setVisible ()을 사용하는 것입니다.
이 코드는 나를 위해 일했다
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
if (Application.sharedPreferences.getInt("type",1) == 2)
{
menuItem = menu.findItem(R.id.menu_travel_orders);
menuItem.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}
이 접근법은 나를 위해 일했습니다.
private Menu thismenu;
if (condition)
{
if(thismenu != null)
{
thismenu.findItem(R.id.menu_save).setVisible(true);
Toast.makeText(ProfileActivity.this,
""+thismenu.findItem(R.id.menu_save).getTitle(),
Toast.LENGTH_SHORT).show();
}else
{
thismenu.findItem(R.id.menu_save).setVisible(false);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.profile_menu, menu);
thismenu = menu;
return true;
}
범위에서 액세스 할 수없는 활동에서 메뉴 항목에 액세스하려고합니다. 뷰가 활동이나 레이아웃 과 바인드되지 않기 때문에 메뉴 항목을 찾기위한 호출은 null 을 리턴 합니다. 호출 .
메뉴 항목은 " Navigation Bar "와 같은 항목으로 바인딩됩니다. " 은 해당 활동과 바인드됩니다.
따라서 활동 ()에서 해당보기를 초기화 한 다음 해당보기가있는 메뉴 항목에 액세스하십시오.
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
사용하다 invalidateOptionsMenu()
전화하기 위해 onPrepareOptionsMenu(menu: Menu?)
onCreateOptionsMenu ()를 사용하여 초기 메뉴 상태를 작성하고 활동 라이프 사이클 동안 변경하지 않아야합니다 ...
이벤트가 발생하고 메뉴 업데이트를 수행하려는 경우 시스템이 onPrepareOptionsMenu ()를 호출하도록 invalidateOptionsMenu ()를 호출해야합니다.
Android kotlin은 프로그래밍 방식으로 작업 표시 줄의 메뉴 항목을 숨기거나 설정합니다.
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.main_menu, menu)
val method = menu.findItem(R.id.menu_method)
method.isVisible = false //if want to show set true
return super.onCreateOptionsMenu(menu)
}