উত্তর:
যাইহোক, ডকুমেন্টেশন সমস্ত জিনিস কভার করে।
ক্রিয়াকলাপটি তৈরি হয়ে গেলে
onCreateOptionsMenu()
, উপরে বর্ণিত পদ্ধতিটিকে কেবল একবার ডাকা হয়।Menu
আপনার কার্যকলাপ বিনষ্ট না হওয়া অবধি সিস্টেমটি আপনাকে এই পদ্ধতিতে সংজ্ঞায়িত করা পুনরায় ব্যবহার করে । আপনি যদি বিকল্প মেনুটি তৈরির পরে যেকোন সময় পরিবর্তন করতে চান তবে আপনাকে অবশ্যইonPrepareOptionsMenu()
পদ্ধতিটি ওভাররাইড করতে হবে । এটি মেনু অবজেক্টটিকে বর্তমানে বিদ্যমান হিসাবে এটি পাস করে। আপনি যদি আপনার অ্যাপ্লিকেশনটির বর্তমান অবস্থার উপর নির্ভর করে মেনু আইটেমগুলি সরাতে, যুক্ত করতে, অক্ষম করতে বা সক্ষম করতে চান তবে এটি দরকারী।
যেমন
@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;
}
অ্যান্ড্রয়েড 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
?
@ ভিকাস সংস্করণ সরল করুন
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
menu.findItem(R.id.example_foobar).setEnabled(isFinalized);
return true;
}
কোনও এসিঙ্কটাস্ক হয়ে গেলে আইটেমগুলি সক্ষম বা অক্ষম করার জন্য কীভাবে বর্তমান মেনুটি আপডেট করবেন।
আমার অ্যাসিঙ্কটাস্ক ডেটা লোড করার সময় আমার ব্যবহারের ক্ষেত্রে আমার মেনুটি অক্ষম করা দরকার ছিল, তারপরে সমস্ত ডেটা লোড করার পরে, ব্যবহারকারীকে এটির ব্যবহার করার জন্য আমাকে আবার সমস্ত মেনু সক্ষম করতে হবে।
এটি অ্যাপ্লিকেশনটিকে ডেটা লোড করার সময় মেনু আইটেমগুলিতে ক্লিক করতে দেয়।
প্রথমে, আমি একটি রাজ্য ভেরিয়েবল ঘোষণা করি, ভেরিয়েবল 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()
হবে, কেবল একবার কল হবে এবং আমার সমস্ত আইটেম চলে যাবে কারণ আমি তাদের শুরুতে রাজ্য সেট আপ করেছি।
তারপরে আমি একটি অ্যাসিঙ্কটাস্ক তৈরি করি যেখানে আমি সেই স্থানে আমার চলকটি 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
। এটি প্রতিটি পৃথক আইটেম সংরক্ষণ করার পরিবর্তে নীরের উত্তরের মতো, আমি পুরো মেনুটি সংরক্ষণ করেছিলাম।
একটি মেনু ঘোষণা করুন 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);
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.home, menu);
return false;
}
যদি দৃশ্যমান মেনু
menu.findItem(R.id.id_name).setVisible(true);
মেনু হাইড করুন
menu.findItem(R.id.id_name).setVisible(false);
রানটাইমের সময় সাধারণত আপনার দর্শনগুলির বৈশিষ্ট্যগুলি পরিবর্তন করতে পারে:
(Button) item = (Button) findViewById(R.id.idBut);
এবং তারপর...
item.setVisibility(false)
কিন্তু
যদি আপনি কনটেক্সটেনু থেকে বিকল্পগুলির ডি দৃশ্যমানতাটি পরিবর্তন করতে চান, আপনার বোতাম টিপুন, আপনি একটি পতাকা সক্রিয় করতে পারেন এবং তারপরে অনক্রিটকন্টেক্সটেনুতে আপনি এর মতো কিছু করতে পারেন:
@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
অদৃশ্য হয়ে যায়।