অ্যাকশনবারে প্রদর্শিত একটি মেনু আইটেম কীভাবে আপডেট করবেন?


94

আমার একটি ক্রিয়াকলাপ আছে যার 2 টি টুকরা রয়েছে। উভয়ই তালিকার ফ্রেম এবং উভয়ই মেনুতে মেনু আইটেম অবদান রাখে। আমার একটি মেনুআইটিম রয়েছে যা আমি অ্যানড্রয়েড বৈশিষ্ট্যটি সেট করেছি: অ্যাকশনবারে একটি বোতাম হিসাবে এটি প্রদর্শন করতে showAsAction। যা ভাল কাজ করে।

এখন মেনু আইটেম রাষ্ট্র নির্ভর। এটি একটি বিরতি / পুনরায় সূচনা মেনু বিকল্পটি সারি থামিয়ে আবার চালু করার জন্য option আমার সমস্যাটি হ'ল ফ্রেগমেন্টটি তৈরি হওয়ার সময় আমি এটির প্রাথমিক মূর্তিটি কীভাবে সেট করব তা আমি বুঝতে পারি না।

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

সমস্যাটি হ'ল, যদি আমি সেই একই মেনু আইটেমটি অ্যাকশনবারে (showAsAction) রাখি, তবে কীভাবে আমি প্রিপার্পেপশনমেনুকে কল না করে আপডেট করতে বাধ্য করতে পারি? আমার এটি করতে সক্ষম হওয়া প্রয়োজন কারণ অ্যাপ্লিকেশনটির প্রথম প্রবর্তনকালে, আমি সারিটি পাওয়ার জন্য একটি অনুরোধ পাঠিয়েছি, তবে অ্যাকশনবার সেটআপ হয়ে প্রদর্শিত হওয়ার পরে টাস্কটি ফিরে আসে। আমি আমার খণ্ডে এমন একটি হ্যান্ডলার তৈরি করেছি যা প্রতিবারই আমার কাছে সারি আপডেট পাওয়ার সাথে সাথে পরিচিত হয়, তবে সেখান থেকে আমি কীভাবে অ্যাকশনবারে আমার মেনু আইটেমটির জন্য পাঠ্য আপডেট করতে পারি? অনপ্রিপারেশন অপশনমেনু ব্যতীত বর্তমানে সেট করা মেনুটিকে এটিকে পরিচালনা করার জন্য আমি কোনও উপায় খুঁজে পাচ্ছি না।

রব ডব্লিউ।

উত্তর:


175

বিকল্প # 1: চেষ্টা করুন invalidateOptionsMenu()। আমি জানি না যে এটি অ্যাকশন বারের তাত্ক্ষণিকভাবে পুনরায় চিত্র অঙ্কন করতে বাধ্য করবে কিনা।

বিকল্প # 2: দেখুন getActionView()ক্ষতিগ্রস্থদের জন্য কিছু ফিরিয়ে দেয় কিনা MenuItem। এটি showAsActionসহজেই আপনার জন্য ক্রিয়াকলাপের দৃষ্টিভঙ্গি তৈরি করে। যদি তা হয় তবে আপনি সম্ভবত এটি সক্ষম / অক্ষম করতে পারেন View

অনপ্রিপারেশন অপশনমেনু ব্যতীত বর্তমানে সেট করা মেনুটিকে এটিকে পরিচালনা করার জন্য আমি কোনও উপায় খুঁজে পাচ্ছি না।

আপনাকে যে জিনিসটি Menuঅর্পণ করা হয়েছিল তাতে আপনি ঝুলতে পারেন onCreateOptionsMenu()দস্তাবেজগুলি উদ্ধৃত করা হচ্ছে :

পরের বার onCreateOptionsMenu () না বলা পর্যন্ত আপনি নিরাপদে মেনুতে (এবং এটি থেকে তৈরি কোনও আইটেম) ধরে রাখতে পারেন desired


4
বিকল্প # 1 চেষ্টা করে এবং এটি কৌশলটি করেছে। যেহেতু আমি পৃথক থ্রেড থেকে কলব্যাকে ইউআই আপডেট করার চেষ্টা করছিলাম, তাই আমি আসলে ইউআই থ্রেডে না থাকায় এটি একটি ব্যতিক্রম ছুঁড়েছিল। এটি ঠিক করতে, আমি একটি হ্যান্ডলার তৈরি করেছি এবং আমার কলব্যাক কল করার পরে হ্যান্ডলারের কাছে একটি রিফ্রেশ বার্তা প্রেরণ করেছি। তবে শেষ পর্যন্ত আমি মেনুটি রিফ্রেশ করার জন্য getActivity ()। অবৈধপরিষ্কারমেনু () ব্যবহার করেছি।
ব্রোকলি

@ ব্রোকলি: আহা, ভাল! সেই পদ্ধতির জন্য জাভাদোকসের বাক্যটি দেওয়া, আমার সন্দেহ ছিল যে এটির কাঙ্ক্ষিত প্রভাব পড়বে, যদিও মনে হবে এটি কারণেই এটি এপিআই লেভেল 11 এ প্রথম স্থানে যুক্ত করেছিল। এটা আপনার জন্য কাজ করে শুনে খুশি!
কমন্সওয়্যার

আমি এটি বের করার চেষ্টা করে প্রাচীরের বিরুদ্ধে আমার মাথাটি আঘাত করে চলেছি এবং এটি একটি কবজির মতো কাজ করে!
MinceMan

7
আপনি যদি সমর্থন লাইব্রেরিটি ব্যবহার করছেন তবে supportInvalidateOptionsMenu()পরিবর্তে ব্যবহার করুন
টিম কিস্ট

4
@ টিমকিস্ট, supportInvalidateOptionsMenu()এখন অবহেলিত ; আপনি নিরাপদে ব্যবহার করতে পারেন invalidateOptionsMenu()
প্রিমো ক্রলজ

12

আমার ক্ষেত্রে: invalidateOptionsMenuকেবলমাত্র পাঠ্যটিকে মূলটিতে পুনরায় সেট করা হয়েছে, তবে সরাসরি মেনু আইটেমটি অ্যাক্সেস করতে এবং ইচ্ছার পাঠ্যটি পুনরায় লেখাই সমস্যা ছাড়াই কাজ করেছে:

if (mnuTopMenuActionBar_ != null) {
    MenuItem mnuPageIndex = mnuTopMenuActionBar_
        .findItem(R.id.menu_magazin_pageOfPage_text);

    if (mnuPageIndex != null) {
        if (getScreenOrientation() == 1) {
            mnuPageIndex.setTitle((i + 1) + " von " + pages);
        }
        else {
            mnuPageIndex.setTitle(
                (i + 1) + " + " + (i + 2) + " " + " von " + pages);
        }
        // invalidateOptionsMenu();
    }
}

নীচের মন্তব্যের কারণে, আমি নিম্নলিখিত কোডের মাধ্যমে মেনু আইটেমটি অ্যাক্সেস করতে সক্ষম হয়েছি:

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

আপনি কীভাবে অ্যাকশনবার দেখুনটির সাথে একটি হ্যান্ডেল পেয়েছিলেন mnuTopMenuActionBar_?
পল মেনেগা

4
যখন অ্যাকশন বারটি ইনিশিয়াল হয়ে যায়, আমি সেই সদস্যটিকে একটি পরিবর্তনশীলতে দৃশ্যটি সংরক্ষণ করেছিলাম ... এর মতো: @ ওভাররাইড পাবলিক বুলিয়ান অনক্রিটঅপশনসেনু (মেনু মেনু) {মেনুআইনফ্লেটার ইনফ্লেটার = getMenuInflater (); inflater.inflate (R.menu.magazine_swipe_activity, মেনু); mnuTopMenuActionBar_ = মেনু; সত্য প্রত্যাবর্তন; }
সিভি

এটি করে আপনি কী সিঙ্ক্রোনাইজেশন সমস্যাগুলি অধিকার করতে পারেন? আমি বলতে চাইতেছি. onCreateOptionMenu চলতে গেলে আপনি ঠিক জানেন না, তাই আপনি আপনার কোডের টুকরোটি mnuTopMenuActionBar_অবিচ্ছিন্ন, ডানদিকে পৌঁছে দিতে পারবেন ? কিভাবে আপনি এই চারপাশে কাজ করবে?
একরপো

হেই, যদি actionbar (হ্যাঁ, এখানে এটা হয়) এই পদ্ধতি সবসময় বলা হয় ব্যবহার করা হয়, তাই (সরাসরি কার্যকলাপ শুরুতে) যে কোন সমস্যা ... এর stackoverflow.com/questions/7705927/...
cV2


4

আমি এই কোডটি ব্যবহার করেছি:

public boolean onPrepareOptionsMenu (Menu menu) {       
    MenuInflater inflater = getMenuInflater();
    TextView title  = (TextView) findViewById(R.id.title);
    menu.getItem(0).setTitle(
        getString(R.string.payFor) + " " + title.getText().toString());
    menu.getItem(1).setTitle(getString(R.string.payFor) + "...");
    return true;        
}

এবং আমার কাছে মনোমুগ্ধের মতো কাজ করেছেন আপনি অনপ্রেপিয়েরাপশনমেনুটি এখানে পাবেন


4
এখানে মেনুআইনফ্লেটারের উদ্দেশ্য কী?
ইগোরগানাপলস্কি

এটি উজ্জ্বল
স্টিভ কামাউ

2

অ্যানক্রিটঅপশনমেনু () এ আপনার কোনও শর্ত সেট করার আগে অ্যাকশন বার আইটেমগুলি আপডেট করার জন্য প্রথমে দয়া করে দুটি লাইন কোড অনুসরণ করুন। উদাহরণ স্বরূপ:

Boolean mISQuizItemSelected = false;

/**
 * Called to inflate the action bar menus
 *
 * @param menu
 *      the menu
 *
 * @return true, if successful
 */

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu items for use in the action bar

    inflater.inflate(R.menu.menu_demo, menu);

    //condition to hide the menus
    if (mISQuizItemSelected) {
        for (int i = 0; i < menu.size(); i++) {
            menu.getItem(i).setVisible(false);
        }
    }

    return super.onCreateOptionsMenu(menu);
}

/**
 * Called when the item on the action bar being selected.
 *
 * @param item
 *      menuitem being selected
 *
 * @return true if the menuitem id being selected is matched
 * false if none of the menuitems id are matched
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getId() == R.id.action_quiz) {
        //to navigate based on the usertype either learner or leo
        mISQuizItemSelected = true;

        ActionBar actionBar = getActionBar();
        invalidateOptionMenu();
    }
}

1

স্পষ্টতার জন্য, আমি ভেবেছিলাম যে কোনও উত্সে দখল করার প্রত্যক্ষ উদাহরণ নীচের থেকে প্রদর্শিত হতে পারে যা আমি মনে করি যে এই প্রত্যক্ষ প্রত্যক্ষ উদাহরণ সহ এই প্রশ্নের প্রতিক্রিয়াতে অবদান রাখবে।

private MenuItem menuItem_;

@Override
public boolean onCreateOptionsMenu(Menu menuF) 
{
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_layout, menuF);
    menuItem_ = menuF.findItem(R.id.menu_item_identifier);
    return true;
}

এই ক্ষেত্রে আপনি শুরুতে একটি মেনু আইটেম রেফারেন্স ধরে রাখুন এবং তারপরে একটি নির্দিষ্ট সময় পরে এটির (উদাহরণস্বরূপ আইকন রাজ্যের পরিবর্তনের জন্য) অবস্থাটি পরিবর্তন করুন।


-1

ইন Kotlin 1.2 কেবল কল:

invalidateOptionsMenu()

এবং onCreateOptionsMenuফাংশন আবার বলা হবে।

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