답변:
어쨌든 문서 는 모든 것을 다룹니다.
활동이 작성되면
onCreateOptionsMenu()
위에서 설명한대로 메소드가 한 번만 호출됩니다. 시스템Menu
은 활동이 파괴 될 때까지이 방법으로 정의한 것을 유지하고 재사용합니다 . 옵션 메뉴를 처음 만든 후 언제든지 변경하려면onPrepareOptionsMenu()
메서드 를 재정의해야합니다 . 현재 존재하는 Menu 객체를 전달합니다. 응용 프로그램의 현재 상태에 따라 메뉴 항목을 제거, 추가, 비활성화 또는 활성화하려는 경우에 유용합니다.
예 :
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (isFinalized) {
menu.getItem(1).setEnabled(false);
// You can also use something like:
// menu.findItem(R.id.example_foobar).setEnabled(false);
}
return true;
}
Android 3.0 이상에서 작업 표시 줄에 메뉴 항목이 표시되면 옵션 메뉴가 항상 열려있는 것으로 간주됩니다. 이벤트가 발생하고 메뉴 업데이트를 수행하려는 invalidateOptionsMenu()
경우 시스템 호출을 요청 하려면 호출해야합니다 onPrepareOptionsMenu()
.
false
메뉴를 완전히 비활성화하려면 돌아가십시오 .
모든 안드로이드 버전에서 가장 쉬운 방법 : 이것을 사용하여 메뉴 작업 아이콘을 비활성화 된 것으로 표시하고 기능을 비활성화 된 상태로 만듭니다.
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(R.id.menu_my_item);
if (myItemShouldBeEnabled) {
item.setEnabled(true);
item.getIcon().setAlpha(255);
} else {
// disabled
item.setEnabled(false);
item.getIcon().setAlpha(130);
}
}
옵션 메뉴를 만들 때 항목을 변수로 저장 한 다음 원하는대로 속성을 변경할 수 있습니다.
private MenuItem securedConnection;
private MenuItem insecuredConnection;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.connect_menu, menu);
securedConnection = menu.getItem(0);
insecuredConnection = menu.getItem(1);
return true;
}
public void foo(){
securedConnection.setEnabled(true);
}
onPrepareOptionsMenu
?
@Vikas 버전 단순화
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
return true;
}
AsyncTask가 완료되었을 때 항목을 활성화 또는 비활성화하기 위해 현재 메뉴를 업데이트하는 방법.
내 유스 케이스에서는 AsyncTask가 데이터를로드하는 동안 메뉴를 비활성화해야했고 모든 데이터를로드 한 후 사용자가 사용할 수 있도록 모든 메뉴를 다시 활성화해야했습니다.
이로 인해 데이터가로드되는 동안 사용자가 메뉴 항목을 클릭 할 수 없었습니다.
먼저 상태 변수를 선언하고 변수가 0이면 메뉴가 표시되고 해당 변수가 1이면 메뉴가 숨겨집니다.
private mMenuState = 1; //I initialize it on 1 since I need all elements to be hidden when my activity starts loading.
그런 다음 onCreateOptionsMenu()
이 변수를 확인합니다 .1이면 모든 항목을 비활성화합니다. 그렇지 않으면 모두 표시합니다.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_galeria_pictos, menu);
if(mMenuState==1){
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(false);
}
}else{
for (int i = 0; i < menu.size(); i++) {
menu.getItem(i).setVisible(true);
}
}
return super.onCreateOptionsMenu(menu);
}
이제 내 활동이 시작되면 onCreateOptionsMenu()
되면 한 번만 호출되며 항목을 설정했기 때문에 모든 항목이 사라집니다.
그런 다음 AsyncTask를 생성합니다. 여기서 상태 변수를 0으로 설정합니다. onPostExecute()
이 단계는 매우 중요합니다!
전화 할 때 invalidateOptionsMenu();
하면 다시 시작됩니다onCreateOptionsMenu();
따라서 상태를 0으로 설정 한 후에는 모든 메뉴를 다시 그리지 만 이번에는 변수가 0 인 상태에서 모든 비동기 프로세스가 완료된 후 모든 메뉴가 표시되며 사용자는 메뉴를 사용할 수 있습니다 .
public class LoadMyGroups extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mMenuState = 1; //you can set here the state of the menu too if you dont want to initialize it at global declaration.
}
@Override
protected Void doInBackground(Void... voids) {
//Background work
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mMenuState=0; //We change the state and relaunch onCreateOptionsMenu
invalidateOptionsMenu(); //Relaunch onCreateOptionsMenu
}
}
내비게이션 드로어에서 수행 할 때 최상의 솔루션
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(0,false);
return true;
}
오래된 질문에 대한 더 현대적인 답변 :
MainActivity.kt
private var myMenuIconEnabled by Delegates.observable(true) { _, old, new ->
if (new != old) invalidateOptionsMenu()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.my_button).setOnClickListener { myMenuIconEnabled = false }
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main_activity, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
menu.findItem(R.id.action_my_action).isEnabled = myMenuIconEnabled
return super.onPrepareOptionsMenu(menu)
}
menu_main_activity.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">
<item
android:id="@+id/action_my_action"
android:icon="@drawable/ic_my_icon_24dp"
app:iconTint="@drawable/menu_item_icon_selector"
android:title="My title"
app:showAsAction="always" />
</menu>
menu_item_icon_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?enabledMenuIconColor" android:state_enabled="true" />
<item android:color="?disabledMenuIconColor" />
attrs.xml
<resources>
<attr name="enabledMenuIconColor" format="reference|color"/>
<attr name="disabledMenuIconColor" format="reference|color"/>
</resources>
styles.xml or themes.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="disabledMenuIconColor">@color/white_30_alpha</item>
<item name="enabledMenuIconColor">@android:color/white</item>
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item_id:
//Your Code....
item.setEnabled(false);
break;
}
return super.onOptionsItemSelected(item);
}
내가 한 것은에 메뉴에 대한 참조를 저장하는 것 onCreateOptionsMenu
입니다. 이것은 각 개별 항목을 저장하는 대신 전체 메뉴를 저장했다는 점을 제외하고는 nir의 대답과 비슷합니다.
메뉴 선언 Menu toolbarMenu;
.
그런 다음 onCreateOptionsMenu
메뉴를 변수 에 저장하십시오.
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
toolbarMenu = menu;
return true;
}
이제 언제든지 메뉴와 모든 항목에 액세스 할 수 있습니다.
toolbarMenu.getItem(0).setEnabled(false);
일반적으로 런타임에서 뷰의 속성을 변경할 수 있습니다.
(Button) item = (Button) findViewById(R.id.idBut);
그리고...
item.setVisibility(false)
그러나
ContextMenu에서 옵션의 가시성을 수정하려면 버튼을 누르면 플래그를 활성화 한 다음 onCreateContextMenu에서 다음과 같이 할 수 있습니다.
@Override
public void onCreateContextMenu(ContextMenu menu,
View v,ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle(R.string.context_title);
if (flagIsOn()) {
addMenuItem(menu, "Option available", true);
} else {
Toast.makeText(this, "Option not available", 500).show();
}
}
이게 도움이 되길 바란다
onCreateContextMenu
방법을 바꿀 수 있다고 이미 언급 한 질문을 올바르게 읽어야 합니다. 그러나이 방법에서 컨텍스트 메뉴에 액세스하고 싶습니다.
onCreateContextMenu
한 번만 호출되지만 버튼을 많이 클릭하면 메뉴 항목을 활성화 / 비활성화 할 수 있습니다.
setEnable()
이 메뉴를 누를 때 발생하는 동작은 변경하지만 모양이 변경되지는 않습니다 (안드로이드 개발자). 따라서 제목을 비활성화 하고 변경하는 것이 더 명확 하거나MenuItem
눈에 보이지 않게 만드는 것이 좋습니다 .