অ্যান্ড্রয়েডে ডায়নামিকভাবে মেনু আইটেমের পাঠ্য কীভাবে পরিবর্তন করবেন


212

আমি onOptionsItemSelected(MenuItem item)পদ্ধতির বাইরে থেকে একটি মেনু আইটেমের শিরোনাম পরিবর্তন করার চেষ্টা করছি ।

আমি ইতিমধ্যে নিম্নলিখিতগুলি করি;

public boolean onOptionsItemSelected(MenuItem item) {
  try {
    switch(item.getItemId()) {
      case R.id.bedSwitch:
        if(item.getTitle().equals("Set to 'In bed'")) {
          item.setTitle("Set to 'Out of bed'");
          inBed = false;
        } else {
          item.setTitle("Set to 'In bed'");
          inBed = true;
        }
        break;
    }
  } catch(Exception e) {
    Log.i("Sleep Recorder", e.toString());
  }
  return true;
}

তবে আমি এই পদ্ধতির বাইরে কোনও নির্দিষ্ট মেনু আইটেমের শিরোনাম পরিবর্তন করতে সক্ষম হতে চাই।


stackoverflow.com/a/32072318/1651286 গ্রহণযোগ্য উত্তর হওয়া উচিত
আখিল বাবা

উত্তর:


127

JxDarkAngel যেমন পরামর্শ দিয়েছে, আপনার ক্রিয়াকলাপের যে কোনও জায়গা থেকে এটিকে কল করে ,

invalidateOptionsMenu();

এবং তারপরে ওভাররাইডিং:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
  MenuItem item = menu.findItem(R.id.bedSwitch);
    if (item.getTitle().equals("Set to 'In bed'")) {
        item.setTitle("Set to 'Out of bed'");
        inBed = false;
    } else {
        item.setTitle("Set to 'In bed'");
        inBed = true;
    }
  return super.onPrepareOptionsMenu(menu);
}

একটি অনেক ভাল পছন্দ। আমি https://stackoverflow.com/a/17496503/568197 থেকে উত্তরটি ব্যবহার করেছি


সব থেকে ভালো সমাধান. কারণ এই ওভাররাইড অ্যান্ড্রয়েড পদ্ধতিটি হুইলটিকে পুনঃস্থাপনের পরিবর্তে।
আজান জামাল

কেবলমাত্র নোট করুন যা onPrepareOptionsMenu()প্রায়শই অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা ডাকা হয়, উদাহরণস্বরূপ যখন কোনও ক্রিয়াকলাপ প্রদর্শন করা হয় এবং প্রতিবার মেনু প্রদর্শিত হয়। সুতরাং এটি খুব কার্যকর নাও হতে পারে, যদি আপনার মেনুটি প্রায়শই পরিবর্তন হয় না।
মিস্টার-আইডিই

1
invalidateOptionsMenu()এছাড়াও কল করবে onCreateOptionsMenu(), যাতে আপনি আপডেট যুক্তি ভিতরে রাখতে পারে onCreateOptionsMenu()
মিঃ-আইডিই

যদি আপনি এটিকে প্রশ্নের প্রাসঙ্গিক হতে সম্পাদনা করেন তবে আমি এটিকে স্বীকৃত উত্তর হিসাবে চিহ্নিত করব
গার্বিট

আসল প্রশ্ন থেকে আপনার কোডটি ব্যবহার করতে @ গার্বিত আপডেট হয়েছে!
টড ডিল্যান্ড

375

আমি মেনু বস্তুর আপনি গ্রহণ করতে কার্যকলাপ মধ্যে একটি রেফারেন্স পালন সুপারিশ করবে onCreateOptionsMenu এবং তারপর ব্যবহার করে MenuItem যে পরিবর্তন প্রয়োজন এবং যখন আপনি এটি প্রয়োজন পুনরুদ্ধার করতে। উদাহরণস্বরূপ, আপনি নীচের লাইনের সাথে কিছু করতে পারেন:

public class YourActivity extends Activity {

  private Menu menu;
  private String inBedMenuTitle = "Set to 'In bed'";
  private String outOfBedMenuTitle = "Set to 'Out of bed'";
  private boolean inBed = false;

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    // Create your menu...

    this.menu = menu;
    return true;
  }

  private void updateMenuTitles() {
    MenuItem bedMenuItem = menu.findItem(R.id.bedSwitch);
    if (inBed) {
      bedMenuItem.setTitle(outOfBedMenuTitle);
    } else {
      bedMenuItem.setTitle(inBedMenuTitle);
    }
  }

}

বিকল্পভাবে, আপনি মেনু আইটেমগুলি প্রতিবার মেনু প্রদর্শিত হবে তা আপডেট করতে প্রিপার্পেপশনগুলি মেনুতে ওভাররাইড করতে পারেন ।


1
আমি সবসময় আশা করি অ্যান্ড্রয়েডের কাছে এই জাতীয় ধরণের সমস্যার আরও মার্জিত সমাধান হবে। মনে হয় সহজ উত্তরগুলি প্রায়শই সেরা - ধন্যবাদ।
স্টিভেন ওল্ফ

12

আপনি এটি একটি বিশ্বব্যাপী "মেনু" অবজেক্ট তৈরি করতে পারেন এবং তারপরে এটি ক্রিয়েটওপশনমেনুতে নির্ধারণ করুন

public class ExampleActivity extends AppCompatActivity
    Menu menu;

তারপরে এখানে নিয়োগ করুন

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

এরপরে প্রয়োজনীয় আইটেমগুলি পাওয়ার জন্য নির্ধারিত মেনু অবজেক্টটি ব্যবহার করুন

menu.findItem(R.id.bedSwitch).setTitle("Your Text");

5

একটি সেটঅপশনসটাইটেল () পদ্ধতি তৈরি করুন এবং আপনার ক্লাসে একটি ক্ষেত্র সেট করুন। যেমন:

String bedStatus = "Set to 'Out of Bed'";

...

public void setOptionsTitle(String status)
{
    bedStatus = status;

}

এখন যখন মেনুটি জনবহুল হয়, শিরোনামটি আপনার স্ট্যাটাস যাই হোক না কেন তাতে পরিবর্তন করুন:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(bedStatus);


        // Return true so that the menu gets displayed.
        return true;
    }

ক্রিয়াকলাপটি রেন্ডার হওয়ার পরে আমার এটি সেট করতে সক্ষম হওয়া দরকার। সুতরাং এই দুটি পদ্ধতির মধ্যে না
গার্বিত

আপনার ক্রিয়াকলাপটি রেন্ডার হওয়ার পরে যে কোনও সময়ে setOptionsTitle এ কল করুন। আমি অনুমান করি যে আপনি কী চাইছেন তা আমি বুঝতে পারছি না কারণ "অ্যাক্টিভিটিস রেন্ডার হওয়ার পরে আমার এটি সেট করতে সক্ষম হওয়া দরকার" আপনি সেট কন্টেন্ট (আর.আলআউট.আইডি) কল করার পরে আমার কাছে আপনার অপশনগুলির পরিবর্তনের প্রয়োজন হতে পারে মেনু প্রদর্শন করে (যা আপনি setOptionsTitle () - যে কোনও পদ্ধতি থেকে, যে কোনও জায়গায়, যে কোনও সময় থেকে করতে পারেন)।
জ্যাক

যদিও এই পদ্ধতিটি কাজ করে তবে মেনুটিকে পরিচালনা করে এমন মেনু অবজেক্টটি সুপারিশ করা হবে না যে শিরোনামটি কখন পরিবর্তন হয়েছে এবং সুতরাং শিরোনাম পরিবর্তিত হওয়ার পরে প্রয়োজনীয় কাজগুলি সম্পাদন করতে পারবেন না, উদাহরণস্বরূপ বিন্যাস এবং লাইন ব্রেক ।
চার্লস হারলে

3

আপনি প্রিপার্পেপশনমেনুতে ওভাররাইডটি আরও ভাল ব্যবহার করুন

menu.Clear ();
   if (TabActual == TabSelec.Anuncio)
   {
       menu.Add(10, 11, 0, "Crear anuncio");
       menu.Add(10, 12, 1, "Modificar anuncio");
       menu.Add(10, 13, 2, "Eliminar anuncio");
       menu.Add(10, 14, 3, "Actualizar");
   }
   if (TabActual == TabSelec.Fotos)
   {
       menu.Add(20, 21, 0, "Subir foto");
       menu.Add(20, 22, 1, "Actualizar");
   }
   if (TabActual == TabSelec.Comentarios)
   {
       menu.Add(30, 31, 0, "Actualizar");
   }

এখানে একটি উদাহরণ


প্রকৃতপক্ষে, উদ্দেশ্যযুক্ত পদ্ধতির ব্যবহার করুন। :) আপনি যদি মেনুতে স্থানীয় রেফারেন্স রাখার সিদ্ধান্ত নেন তবে আপনার মনে হবে প্রসঙ্গ ফাঁসের বিষয়ে আপনার চিন্তা করা দরকার। হয়তো বা না. তবে অবশ্যই এই পদ্ধতির সাথে নয়।
উইলিয়াম টি। ম্যালার্ড

3

আমি আমার নীচের নেভিগেশন আইটেমটি কস্টিউম করতে এই কোডটি ব্যবহার করি

BottomNavigationView navigation = this.findViewById(R.id.my_bottom_navigation);
Menu menu = navigation.getMenu();
menu.findItem(R.id.nav_wall_see).setTitle("Hello");

2

আপনার মেনু ক্ষেত্রটি ঘোষণা করুন।

private Menu menu;

নিম্নলিখিতটি onCreateOptionsMenu () পদ্ধতি রয়েছে

public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
    try {
        getMenuInflater().inflate(R.menu.menu_main,menu);
    } catch (Exception e) {
        e.printStackTrace();
        Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage());
    }
    return super.onCreateOptionsMenu(menu);
}

নিম্নলিখিত আপনার নাম সেটারের ক্রিয়াকলাপ হবে। হয় বাটন ক্লিকের মাধ্যমে বা শর্তসাপেক্ষ কোডের মাধ্যমে

public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}

এটি আমার পক্ষে কাজ করেছে।


0

আমার কাছে মনে হচ্ছে আপনি কোনও স্থানীয় পদ্ধতির অভ্যন্তরে মেনুর সামগ্রীগুলি পরিবর্তন করতে চান এবং যখনই কোনও ঘটনা ঘটেছে বা ক্রিয়াকলাপ UI থ্রেডে এই পদ্ধতিটি যে কোনও সময় বলা হয়।

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

আপনি পরিবর্তন করতে চান এই মেনু আইটেমটির সূচি আগেই জানা উচিত। মেনুটি সাফ করার পরে আপনাকে মেনু এক্সএমএল স্ফূরণ করতে হবে এবং আপনার আইটেমের নাম বা আইকন আপডেট করতে হবে।


0

এমন ব্যক্তির জন্য যেগুলি শিরোনামটি স্থিতিশীলভাবে সেট করা দরকার। এটি AndroidManLive.xML এ করা যেতে পারে

<activity
    android:name=".ActivityName"
    android:label="Title Text" >
</activity>

বিকল্প মেনু শিরোনাম পাঠ্য


3
প্রশ্নগুলি গতিশীল জন্য, স্থিতিশীল নয়!
ইঞ্জিনসেন্স

এখনও গুগল অনুসন্ধানে এসেছিল এবং আমাকে সহায়তা করেছে, পোস্ট করার জন্য ধন্যবাদ
ব্রুভস্কি

0

খণ্ডটির জন্য আমার মেনু আইকনটি পরিবর্তন করা দরকার। আমি এই প্রশ্নের খণ্ডনের জন্য চার্লসের উত্তরটি কিছুটা পরিবর্তন করেছি:

    private Menu top_menu;

    //...
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       setHasOptionsMenu(true);
       //...
       rootview = inflater.inflate(R.layout.first_content,null);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_menu, menu);
        this.top_menu = menu;
    }


    // my procedure
    private void updateIconMenu() {
         if(top_menu!= null) {
             MenuItem nav_undo = top_menu.findItem(R.id.action_undo);
             nav_undo.setIcon( R.drawable.back);
         }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.