অ্যান্ড্রয়েড: ক্রিয়াকলাপ জীবনচক্রের সময় অনক্রিপশন মেনু কখন ডাকা হয়?


149

আমি বেশ কয়েকটি ব্রেকপয়েন্ট রেখেছি onCreate(একটি শুরুতে এবং একটি পদ্ধতির শেষে) এবং আমি এটির শুরুতে একটি রেখেছিলাম onCreateOptionsMenuonCreateপদ্ধতি প্রথম বলা হয়, এবং এটি শেষ করার আগে করা হয় onCreateOptionsMenuবলা হয়।

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

উত্তর:


112

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

এটি অফিসিয়াল হানিকম্ব স্টাইলের অ্যাকশন বার সহ ডিভাইস এবং অ্যাপ্লিকেশনগুলিতে সত্য হবে be যদি কোনও অ্যাকশন বার onCreateOptionsMenu()না থাকে, ব্যবহারকারী সাধারণত মেনু বোতাম টিপে মেনু কল না করা পর্যন্ত কল করা উচিত নয়।

(এটি নির্ধারণ করার জন্য আমি পর্দার আকার ব্যবহার করছি, বড় পর্দার জন্য আমার লেআউট ফাইলটিতে লেআউটটি স্ফীত হওয়ার পরে আমি যাচাই করেছি has

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


আমি উল্লেখ করতে ভুলে গেছি যে আমি অ্যাকশনবারেরলক গ্রন্থাগারটি ব্যবহার করছি। আপনার উত্তর আমাকে মনে করিয়ে দিয়েছে। এটি সম্ভবত এই আচরণের কারণ, কারণ এটি সামঞ্জস্য লাইব্রেরির একটি মোড়ক, যা মেনু আইটেমগুলিকে "অ্যাকশনবারে" রাখে।
ক্রিস্টোফার পেরি

@ কমন্সওয়্যার - এর অর্থ ডিভাইস এবং অ্যাপ্লিকেশনগুলিতে যার অ্যাকশন বার নেই। যদি মেনুর আইটেমটি দৃশ্যমান না থাকে তবেওCreateOptions মেনু প্রদর্শিত হবে?
নিনজা কোডার

12
আমার ক্ষেত্রে
onCreateMenu অনার

1
হ্যাঁ আমারও একই সমস্যা ... তবে আমার কোডটি একটি খণ্ডের সাথে সম্পর্কিত।
ইয়োন হারকিউট

আমি খোলা ছিল NPEকিনা তা পরীক্ষা করার সময় আমি থাকতে শুরু করেছি । আমাকে ক্রিয়াকলাপেপেনশনমেনু এবং সেইসাথে কলব্যাক যে এই টুকরাটি তার অনক্রিপশনমেনুতে ব্যবহার করেছিল তা উভয়ই নাল চেক রাখতে হয়েছিল। সত্যই অদ্ভুত কারণ এটি কেবল কয়েকটি স্ক্রিনে ঘটছিল, তবে ধারাবাহিকভাবে সেগুলি। nav drawer fragmentonCreateOptionsMenu
theblang

54

আমার ক্ষেত্রে অ্যান্ড্রয়েড ২.৩ এ এবং FragmentActivityভি 4-সমর্থন লাইব্রেরি সহ জীবন-চক্র পদ্ধতির ক্রম অনুসরণ করা হচ্ছে:

07-18 18:29:21.629  20183-20183/? I/onCreate:
07-18 18:29:21.719  20183-20183/? I/onStart: 
07-18 18:29:21.719  20183-20183/? I/onResume: 
07-18 18:29:21.739  20183-20183/? I/onCreateOptionsMenu:

27

আমি জানতে পেলাম যে অনারিউমিতে () আমি কল করি

invalidateOptionsMenu();

তারপরে ক্রিয়েটঅ্যাপশনসমেনু (মেনু মেনু) পরে বলা হয় - ক্রিয়াকলাপের জীবনচক্র অনুসারে (আমার মনে হয় এটি এখানে সঠিক শব্দ) , @ tir38 দ্বারা নির্দেশিত

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}

4
আপনি যদি অ্যাকশনবার্লক ব্যবহার করে থাকেন তবে এই পদ্ধতিটি কল করুনsupportInvalidateOptionsMenu();
শান জিশি

3
আপনি "তাত্ক্ষণিক" বললে সাবধান হন। সত্যই তাৎক্ষণিকভাবে ঘটবে না। আপনি যখন invalidateOptionsMenu(পুনরায়) অপশন মেনু তৈরি করবেন তখন কোনও চাকরী ইউআই এর বার্তার কাতারে যুক্ত হবে। কিউতে যা আছে তা আগে চালানো হবে।
tir38

21

উপরের উত্তরে সংযোজন, আইসিএস এবং মধুচক্রের ক্ষেত্রে onCreateOptionsMenu কে onCreate এবং onPostCreate এর পরে বলা হয় যখন জিঞ্জারব্রেড এবং পূর্ববর্তী সংস্করণগুলিতে এটি অনক্রিটের পরে বলা হয় তবে onPostCreate এর আগে বলা হয়। আমি খুঁজে পেল শুধুমাত্র পার্থক্য।


3

ActionBarActivityসমর্থন v7 থেকে আমার অভিজ্ঞতার onCreateOptionsMenu()মধ্যে এটির setContentView()মাঝখানে পদ্ধতিতে ডাকা onCreate()হয় 4.1.1 এ উপস্থিত হয়।

তবে ৪.৪-তে আরেকটি গল্প onCreateOptionMenu()বলা হয়েছিল onCreate()। এছাড়াও আমি জানি না এটি তাত্ক্ষণিক পরে হতে পারে, সম্ভবত নাও। তবে সত্য ঘটনা। আমি অন্যান্য সংস্করণে পরীক্ষা করিনি তবে ৪.১.১ প্রথম যেখানে আমার আর ডি অর্ডার নিয়ে সমস্যা হয়েছিল।


সম্ভবত আপনি ব্যবহার প্রয়োজন supportInvalidateOptionsMenu()?
ডেভিড ডি সি ই ফ্রেইটাস

2

অনারেসিউম () এবং অনক্রিটঅপশনমেনু () এর সময়কালীন সমস্যাগুলি এড়াতে আপনার খণ্ডে একটি কলব্যাক-ফাংশন তৈরি করার পরামর্শ দিই।

নিম্নলিখিত কাজগুলি আমার জন্য নির্দোষ:

  1. আপনার ক্রিয়াকলাপে আপনার খণ্ড তৈরি এবং যুক্ত করুন
  2. আপনার ক্রিয়াকলাপে এই খণ্ডটির একটি রেফারেন্স রেখে দিন
  3. আপনার খণ্ডে একটি সরকারী পদ্ধতি doSomethingWithTheMenu () তৈরি করুন
  4. onCreateOptionsMenu (মেনু মেনু) কল করার সময় আপনার কার্যকলাপের মধ্যে থেকে এই পদ্ধতিটিকে কল করুন।

উদাহরণ:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.