অ্যান্ড্রয়েড: বিকল্প মেনু আইটেমগুলি প্রোগ্রামিকভাবে পরিবর্তন করা


89

বিকল্প মেনু আইটেমগুলি প্রোগ্রামিকভাবে পরিবর্তন করা সম্ভব? দয়া করে কেউ আমাকে একটি উদাহরণ সরবরাহ করতে পারেন?

এছাড়াও, আমি নির্দিষ্ট কিছু আইটেম অক্ষম করতে চাই, যাতে তারা ক্লিকগুলি না শোনায়, এটি কি সম্ভব?

উত্তর:


212

কারও জন্য মেনুটির বিকল্পগুলি পরিবর্তনশীলভাবে পরিবর্তন করা দরকার:

private Menu menu;

// ...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.options, menu);
    return true;
}

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}

8
একটি সতর্কতা হ'ল এটি নিশ্চিত করার জন্য আপনাকে menuএটি থেকে MenuItemবেরিয়ে আসার চেষ্টা করার আগে সেট করা হয়েছে । উদাহরণস্বরূপ, যদি আপনি ভালো কিছু আছে যদি actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS), ট্যাব মেনু সামনে লোড করা হয়, তাই কলিং hideOption/ showOptionমধ্যে onTabSelectedএকটি নাল পয়েন্টার ব্যতিক্রম মধ্যে ফলাফল নেই।
সল্টনিটস

আমি যখন ব্যবহার করি তখন item.setVisible(false);আইটেমটি কেবল তখনই গোপন হয়ে যায় যখন আমি নিজে মেনুতে ক্লিক করি। আমি যদি invalidateOptionsMenu();আইটেমটি ব্যবহার করি তবে ক্লিক করতে সাড়া দেয় না। আমি যদি প্রশংসা করি যে আপনি যদি একইরকম একটি সমস্যার মুখোমুখি হয়ে আমাকে সহায়তা করতে পারেন তবে। stackoverflow.com/questions/54756799/...
Aliton মধ্যে Oliveira

অ্যালিটন অলিভেরা আপনার ফ্ল্যাগের পরিবর্তনশীল স্থিতি যাচাই করে আপনার আইটেম.সেটভিশিলিটি (মিথ্যা) অংশটি onCreateOptionsMenu পদ্ধতির ভিতরে রেখে দেওয়া উচিত এবং আপনার পতাকাটির অমূল্য মান এবং অকার্যকরন অপশনমেনু পরিবর্তন করা উচিত। এটা কাজ করবে।
কিডাস টেকেষ্টে

ডকুমেন্টেশনে setVisibleবলা হয়েছে যে setEnabled(false)আপনারও কল করা উচিত অন্যথায় আইটেমটি এখনও এটির শর্টকাটের মাধ্যমে আহ্বান করা যেতে পারে
ফ্লোরিয়ান ওয়ালথার

34

মেনু.এক্সএমএল

  <item 
    android:id="@+id/item1"
    android:title="your Item">
  </item>

আপনার জাভা ফাইল রাখুন

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}

এটিই আমি খুঁজছিলাম কারণ আমি রানটাইমে একবার সিদ্ধান্ত নিতে চাই তবে তার পরে বিকল্পগুলি পরিবর্তন করার দরকার নেই। আমি ব্যবহার করেছি: @ ওভাররাইড পাবলিক বুলিয়ান অন প্রিপার্পেপশনস মেনু (মেনু মেনু) {যদি (! ShowItemName)। মেনু.রেমোআইটেম (R.id.itemname); সত্য প্রত্যাবর্তন; }
notmystyle

20

যেমন নিকোলে বলেছিলেন যে এটি প্রিপার্পেপশনমেনু () তে করুন।

অ্যাকশন বারে মেনু আইটেমগুলির জন্য আপনাকে মেনুটি অবৈধ করতে হবে activity.invalidateOptionsMenu();

এটি এখানে আরও বিশদে বর্ণিত হয়েছে যখন প্রিপার্পেপশনস মেনু মেনু এন্ট্রিগুলি স্যুইচ করে আমি কীভাবে অ্যাকশনবারকে রিফ্রেশ করতে পারি?


7

আমাকে যদি আমার অপশন মেনুটির বিষয়বস্তু পরিবর্তন করতে হয় তবে আমি এটি onMenuOeded () চলাকালীন সম্পাদন করব। এটি ব্যবহারকারীকে মেনুটিতে অ্যাক্সেস করছে এমন মুহুর্তে চলমান অবস্থা যাচাই করতে সহায়তা করে।

public boolean onMenuOpened(int featureid, Menu menu)
    {
        menu.clear();
        if (!editable)
        {
            MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
            MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
            MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
            itemAdd.setShortcut('0', 'a');
            itemMod.setShortcut('1', 'm');
            itemDel.setShortcut('2', 'd');
        }
        else
        {
            MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
            itemSave.setShortcut('0', 'S');
        }


        return true;
    }

মন্তব্যের কয়েকটি কথা। onMenuOpened দুইবার বলা হয়। প্রথমবারের মেনুটি নাল, দ্বিতীয় বারের মেনু ভেরি ব্যবহারের জন্য প্রস্তুত। আমি সর্বদা 'if' ধারাটি মেনু ভেরি শূন্য নয় কিনা তা পরীক্ষা করতে ব্যবহার করি।
কিসিডজ পিস্তোলেট 19

7

নির্দিষ্ট আইটেম অক্ষম করতে:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);

যখন আমি সেট করি item.setVisible(false);, আমার আইটেমটি কেবল তখনই গোপন হয়ে যায় যখন আমি নিজে মেনুতে ক্লিক করি (তিনটি বিন্দু)। আমি যদি invalidateOptionsMenu();কিছু আইটেম ব্যবহার করি তবে ক্লিক করতে সাড়া দেয় না। আমি যদি প্রশংসা করি যে আপনি যদি একইরকম একটি সমস্যার মুখোমুখি হয়ে আমাকে সহায়তা করতে পারেন তবে। stackoverflow.com/questions/54756799/...
Aliton মধ্যে Oliveira

4

মেনুতে মানগুলি যুক্ত করতে আমি নীচের লাইনগুলি ব্যবহার করেছি

getActivity().invalidateOptionsMenu();

এই কাজটি আমার কাছে কবজির মতো চেষ্টা করুন।


3

এই কোড ব্যবহার করে দেখুন:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu=menu;
    updateMenuItems(menu);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.document_list_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    if (item.getItemId() == android.R.id.home) {
        onHomeButtonPresssed();
    }else if (item.getItemId() == R.id.action_delete) {
        useCheckBoxAdapter=false;
        deleteDocuments();
    } else if (item.getItemId() == R.id.share) {
        useCheckBoxAdapter=false;
        shareDocuments();
    } else if (item.getItemId() == R.id.action_tick) {
        useCheckBoxAdapter=true;
        onShowCheckboxes();
    }
    updateMenuItems(menu);
    return true;
}

private void updateMenuItems(Menu menu){
    if (useCheckBoxAdapter && menu != null) {
        menu.findItem(R.id.action_delete).setVisible(true);
        menu.findItem(R.id.share).setVisible(true);
        menu.findItem(R.id.action_tick).setVisible(false);
    } else {
        menu.findItem(R.id.action_delete).setVisible(false);
        menu.findItem(R.id.share).setVisible(false);
        menu.findItem(R.id.action_tick).setVisible(true);
    }
    invalidateOptionsMenu();
}

আমি যখন ব্যবহার করি invalidateOptionsMenu();, আমার সর্বদা দৃশ্যমান আইটেমগুলি কাজ করা বন্ধ করে দেয় (আমি বলতে চাইছি আইটেমগুলি ক্লিক করতে সাড়া দেয় না)। আমি যদি প্রশংসা করি যে আপনি যদি একইরকম একটি সমস্যার মুখোমুখি হয়ে আমাকে সহায়তা করতে পারেন তবে। stackoverflow.com/questions/54756799/...
Aliton মধ্যে Oliveira

2

আমার মতো সহজ কিছু আপনি করতে পারেন do যখন মেনু আইটেমটি স্পর্শ করা হয় তখন প্রয়োজনীয় পাঠ্যে কেবল পরিবর্তন করুন। আমার শব্দটি বন্ধ এবং চালু করার দরকার ছিল, এটির সাথে স্পর্শ করে কোনও ক্রিয়া সম্পাদন করার ক্ষমতাও। আমার কোডটি এখানে:

    @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.audioOn:
        audioOn = !audioOn;
        if (audioOn)
            item.setTitle("Audio Off");
        else
            item.setTitle("Audio On");
        return true;

    case R.id.touchOn:
        touchOn = !touchOn;
        if (touchOn)
            item.setTitle("Touch Off");
        else
            item.setTitle("Touch On");
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

অডিওঅন এবং টাচঅন হ'ল কোডের অন্যান্য অংশে বুলিয়ান checked আশাকরি এটা সাহায্য করবে.


আমি কীভাবে এটি গতিশীলভাবে করতে পারি। আমি বলতে চাইছি ... কোনও বিকল্প আইটেম নির্বাচন করার পরে একটি ওয়েব সার্ভিস কল করা এবং তার সফল প্রতিক্রিয়ায় ... অনিয়ন্ত্রিত ক্রিয়াকলাপগুলি মেনুকে পুনরায় কল করা। কীভাবে করবেন?
নরেন্দ্র সিং

1

আপনি নীচের মত বাস্তবায়ন করে আপনার কাজটি সম্পাদন করতে পারেন:

private Menu menu;

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.drive_menu, menu);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu = menu;
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_toggle_grid) {
        handleMenuOption(id);
        return true;

    } else if(id == R.id.action_toggle_list){
        handleMenuOption(id);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private void handleMenuOption(int id) {
    MenuItem item = menu.findItem(id);
    if (id == R.id.action_toggle_grid){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_list).setVisible(true);
    }else if (id == R.id.action_toggle_list){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_grid).setVisible(true);
    }
}

1

যদি আপনার নীচে একটি বার থাকে:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
        getMenuInflater().inflate(R.menu.more_menu, menu);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.preferences:
            startActivity(new Intent(this, PreferenceActivity.class));
            break;
    }

    return super.onOptionsItemSelected(item);
}

তারপরে আপনাকে কেবল কল করতে হবে:

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}

1

সরঞ্জামদণ্ডের বিকল্পসমূহ মেনু আইটেমগুলি প্রোগ্রামিকভাবে অ্যাক্সেসের জন্য কোটলিন কোড এবং পাঠ্য / আইকনটি পরিবর্তন করুন, ..:

1-আমাদের মেনু আইটেমগুলিতে মেনু আইটেম ফাইল রয়েছে: মেনু.এক্সএমএল, এর জন্য নমুনা কোড:

 <?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/balance"
      android:title="0"
      android:orderInCategory="100"
      app:showAsAction="always" />
 </menu>

2- শ্রেণিতে মেনু অবজেক্ট অ্যাক্সেসের জন্য একটি ভেরিয়েবল সংজ্ঞা দিন:

var menu: Menu? = null

3- এটি তৈরি করুনঅ্যাপশনমেনুতে শুরু করুন:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.main, menu)
    this.menu = menu
    return true
}

4- আপনার কোড বা মজার ভিতরে মেনু আইটেম অ্যাক্সেস করুন:

private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
    menuItemBalance?.title = Balance?.toString() ?: 0.toString()
    // for change icon : menuWalletBalance?.icon
}

1
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar, menu);
        if(show_list == true) {         

        if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);

        return true;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.