OnCreateOptionsMenu () কে খন্ডে কল করা হয়নি


107

আমার কাছে এমন একটি অ্যাপ রয়েছে যা 2 টি খণ্ডকে অনুভূমিকভাবে স্থাপন করে একটি ক্রিয়াকলাপ পেয়েছিল।

আমার ক্রিয়াকলাপে আমি মেনুটি ব্যবহার করে onCreateOptionsMenu()ব্যবহার করেছি যা আমি অ্যাকশনবারের বিকল্প মেনু প্রদর্শন করতে সক্ষম। তবে যখন আমি আমার খণ্ডগুলির মধ্যে একটি থেকে অ্যাকশন বার মেনু আইটেমগুলি আপডেট করার চেষ্টা করি তখন onCreateoptionsmenu()এটিকে বলা হয় না। সুতরাং, আমি অ্যাকশন বার বিকল্প মেনু আপডেট করতে সক্ষম নই।

আমার ক্রিয়াকলাপের কোডটি নীচের মতো:

myActivity.java

package com.andr.androidtablelist;

import java.io.IOException;

import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import com.andr.fragments.ListLeftFragment;
import com.andr.utils.DBHelper;

      public class TabletActivity extends Activity {
    ActionBar actionBar = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DBHelper dbhelper;
        dbhelper = new DBHelper(this);
        try {
            dbhelper.createDatabase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        setContentView(R.layout.activity_tablet);
        actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(false);
        getFragmentManager().beginTransaction()
                .replace(R.id.master, ListLeftFragment.newInstance()).commit();
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            Toast.makeText(
                    getApplicationContext(),
                    "Back Stack Count::"
                            + getFragmentManager().getBackStackEntryCount(),
                    Toast.LENGTH_LONG).show();
            if (getFragmentManager().getBackStackEntryCount() == 1) {
                actionBar.setDisplayHomeAsUpEnabled(false);
            }
            if (getFragmentManager().getBackStackEntryCount() > 1) {
                getFragmentManager().popBackStack();

            }
            return true;

        }
        return super.onOptionsItemSelected(item);
    }

}
      // http://www.vogella.com/articles/AndroidListView/article.html

myFragment.java

      package com.andr.fragments;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;

import com.andr.androidtablelist.R;
import com.andr.helper.LazyHelper;

   public class ListLeftFragment extends Fragment{
    private static ListLeftFragment listFragment = null;

    public static ListLeftFragment newInstance(){
        listFragment = new ListLeftFragment();      
        return listFragment;
    }

     @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);


    }

     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
         View v =  inflater.inflate(R.layout.fragment_listlayout, container,false);
         getActivity().invalidateOptionsMenu();
         ListView lv = (ListView)v.findViewById(R.id.lview);
         String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                    "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                    "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux",
                    "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
                    "Android", "iPhone", "WindowsMobile" };
         getActivity().getActionBar().setTitle("LeftList");

          ArrayList<String> list = new ArrayList<String>();
         LazyHelper lHelper = new LazyHelper(getActivity());
         list = lHelper.getLazyDetials();

           /* for (int i = 0; i < values.length; ++i) {
              list.add(values[i]);
            }
            final StableArrayAdapter adapter = new StableArrayAdapter(getActivity(),
                android.R.layout.simple_list_item_1, list);*/
            LeftListAdapter lAdapter = new LeftListAdapter(getActivity(),list);
            lv.setAdapter(lAdapter);
            lv.setOnItemClickListener(new OnItemClickListener()
            {

                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int pos, long arg3) {
                    final String clickedData = (String)arg0.getItemAtPosition(pos);
                    Bundle bundle = new Bundle();
                    bundle.putString("clickedItemName", clickedData);
                    Fragment detailFragment = DetailFormRightFragment.newInstance();
                    detailFragment.setArguments(bundle);
                    getActivity().getFragmentManager().beginTransaction().replace(R.id.details, detailFragment).addToBackStack(null).commit();
                }

            }
                    );
         return v;
    }


     @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        getActivity().getMenuInflater().inflate(R.menu.search, menu);
        SearchView searchView=(SearchView)menu.findItem(R.id.search);
        searchView.setIconifiedByDefault(true);
    } 

     @Override
    public boolean onOptionsItemSelected(MenuItem item) {

         super.onOptionsItemSelected(item);
         return false;
    }


     @Override
    public void onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
        /*MenuItem item;
        menu.clear();
        getActivity().getMenuInflater().inflate(R.menu.search, menu);
        SearchView searchView=(SearchView)menu.findItem(R.id.search);
        searchView.setIconifiedByDefault(true);*/
    }

     private class StableArrayAdapter extends ArrayAdapter<String> {

            HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

            public StableArrayAdapter(Context context, int textViewResourceId,
                List<String> objects) {
              super(context, textViewResourceId, objects);
              for (int i = 0; i < objects.size(); ++i) {
                mIdMap.put(objects.get(i), i);
              }
            }

            @Override
            public long getItemId(int position) {
              String item = getItem(position);
              return mIdMap.get(item);
            }

            @Override
            public boolean hasStableIds() {
              return true;
            }

          }

     private class LeftListAdapter extends BaseAdapter implements OnClickListener {
         private Context mcontext;
         ArrayList<String> listData;
         private  LayoutInflater inflater=null;
         public LeftListAdapter(Context context, ArrayList<String> listItems) {
              mcontext=context;
              listData=listItems;
              inflater = (LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         }

        @Override
        public int getCount() {
            return listData.size();
        }

        @Override
        public Object getItem(int arg0) {
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View view, ViewGroup arg2) {
            // create a ViewHolder reference
            View vi=view;
            if(vi==null){
                vi = inflater.inflate(R.layout.item, null);
            }
            TextView text=(TextView)vi.findViewById(R.id.text);
            text.setText(listData.get(position));
            vi.setOnClickListener(this);
            return vi;
        }

        @Override
        public void onClick(View vi) {
            TextView text=(TextView)vi.findViewById(R.id.text);
            Bundle bundle = new Bundle();
            bundle.putString("clickedItemName", text.getText().toString());
            Fragment detailFragment = DetailFormRightFragment.newInstance();
            detailFragment.setArguments(bundle);
            getActivity().getFragmentManager().beginTransaction().replace(R.id.details, detailFragment).addToBackStack(null).commit();          
        }

     }
   }

উত্তর:


295

আপনার খণ্ডের onCreateView()পদ্ধতিতে, setHasOptionsMenu(true)হোস্ট ক্রিয়াকলাপটি বলার জন্য আপনাকে কল করতে হবে যে আপনার খণ্ডে মেনু বিকল্প রয়েছে যা এটি যুক্ত করতে চায়।


আমি পরিবর্তনটি করেছি, তবে অ্যাপটি 11-27 01: 55: 34.468: ই / অ্যান্ড্রয়েডআরটাইম (12294) দিয়ে ক্র্যাশ করেছে: এর দ্বারা তৈরি হয়েছে: java.lang.ClassCastException: com.android.intern.view.menu.MenuItemImpl অ্যান্ড্রয়েডে কাস্ট করা যাবে না .wwget.S SearchView
Android_programmer_office

হ্যাঁ আমি সমস্যাটি খুঁজে পেয়েছি। অনুসন্ধান ভিউয়ের জন্য getActionView () যুক্ত করতে ভুলে গেছেন।
অ্যান্ড্রয়েড_প্রগ্রাম_অফিস

2
এছাড়াও আপনাকে অনক্রিটঅ্যাপশনস মেনু (মেনু মেনু, মেনু ইনফ্লেটার ইনফ্লেটার) এর জন্য অকার্যকর প্রকারটি ব্যবহার করতে হবে বুলিয়ান টাইপটি কাজ করবে না
বাহা হ্যানি

15
আপনি যদি Toolbarআপনার ক্রিয়াকলাপের বিন্যাসে ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে আপনি setSupportActionBar(your_toolbar)আপনার ক্রিয়াকলাপে কল করেছেন। অন্যথায় setHasOptionsMenuএর কোনও প্রভাব নেই।
আর্টকোনিগ

তুমি আমার ভালবাসা ভাই :)
কাদির হুসেন

30

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

আপনি অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল খুলতে পারেন, অ্যান্ড্রয়েড: থিমের মান "@ অ্যান্ড্রয়েড : স্টাইল / থিম / হোল.লাইট.ডार्কএ্যাকশনবার" বা অ্যাকশনবারকে সমর্থন করে এমন কোনও অন্যান্য থিমে পরিবর্তন করতে পারেন।


আমি সমর্থন লাইব্রেরি এবং থিম.অ্যাপকম্প্যাট.লাইট.নো অ্যাকশনবার থেকে থিম হিসাবে টুলবারটি ব্যবহার করছি এবং আমিও একই সমস্যার মুখোমুখি হচ্ছি ... কোনও বিকল্প মেনু প্রদর্শিত হবে না ...
প্লিজ

6
আমি কল করে এটি সমাধান করেছিtoolbar.inflateMenu(R.menu.menu_custom);
ধ্রুবম গুপ্ত

আপনার ক্রিয়াকলাপে কেবল সেটসপোর্টঅ্যাকশনবার (এমটুলবার) কল করুন এবং খণ্ডগুলিতে onCreateOptionsMenu স্বয়ংক্রিয়ভাবে কল হবে।
ভুট কাপিতোলা


11

এছাড়াও, নিশ্চিত হয়ে নিন যে আপনি যে সরঞ্জামদণ্ডটি যাচ্ছেন সেগুলি

setSupportActionBar(toolbar);

আপনার ক্রিয়াকলাপটি নয় null, কারণ এটি যদি সত্যিই হয় তবে nullআপনি ব্যতিক্রম পাবেন না এবং আমার মতো কয়েক ঘন্টা আপনি হারাবেন।

আমি মতামতগুলি আবদ্ধ করতে বাটারনিফ ব্যবহার করেছি , তবে দুর্ভাগ্যক্রমে আমি কলটি করার setSupportActionBar(toolbar)আগেই রেখেছিButterKnife.bind()


1
হারিস, আপনি দুর্দান্ত এই ভাগ করার জন্য আপনাকে ধন্যবাদ! আমার এই সঠিক সমস্যাটি ছিল কারণ আমি কোটলিন ব্যবহার করছি এবং অনেক সময় আপনাকে ভিউবিআইআইডি ইত্যাদি করতে হবে না ... আপনার প্রয়োজনীয় ভিউটি পেতে।
ডিওয়ান্ডারার

1

কেবল হোস্টের ক্রিয়াকলাপটি বলুন যে আপনার খণ্ডটির কনস্ট্রাক্টরে বিকল্প মেনু রয়েছে।

সর্বজনীন আপনার ক্ষেত্র () {setHasOptionsMenu (সত্য);

যদিও এটি আমার পক্ষে কাজ করেছে, এটি @ আলডোরাইন-এর মন্তব্যে উল্লিখিত হিসাবে নিরুৎসাহিত করা হয়েছে

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

সুতরাং পরিবর্তে onCreateView () বা onAttach () এ সেটহ্যাসঅপশনস মেনু (সত্য) রাখুন।


আপনি কাস্টম টুকরা জন্য আপনার নিজস্ব
নির্মাতারা

1
বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / অ্যান্ড্রয়েড / অ্যাপ্লিকেশন / ফ্রেগমেন্ট.এইচটিএমএল টিএল; ডাঃ 'অ্যাপ্লিকেশনগুলির সাধারণত একটি [খণ্ড] নির্মাণকারী কার্যকর করা উচিত নয়' '
aldorain

0

আমার কাছে এমন একটি থিম রয়েছে যা আপনাকে ডিফল্টরূপে অ্যাপবার সরবরাহ করে না এবং পরিবর্তে এই বৈশিষ্ট্যটি সরবরাহ করতে আপনি একটি সরঞ্জামদণ্ডের ভিউ ব্যবহার করছেন, আপনার ক্রিয়াকলাপটি পরিচালনা করে এমন ক্রিয়াকলাপের অনক্রিট () পদ্ধতিতে সেটসপুয়ার্ট অ্যাকশনবার (সরঞ্জামদণ্ড) কল করতে ভুলবেন না your টুকরা।

এর পরে আপনার অনক্রিট () টুকরা পদ্ধতিতে সেটহ্যাসঅপশনস মেনু (সত্য) কল করুন।

:)


-2

সেট setHasOptionsMenu(true)মধ্যে onCreateView()টুকরা মধ্যে পদ্ধতি।

@Override

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
 {
    Viewroot=inflater.inflate(R.layout.fragment_client_requestfragment,container,false);
  hideKeyboard();
    getemail = getArguments().getString("email_id");
    Log.e("email_id from activity",getemail);
    setHasOptionsMenu(true);
    return root;
}

1
হ্যালো এবং এসও আপনাকে স্বাগতম। দয়া করে কেবল অবিচলিত এবং খারাপ ফর্ম্যাট কোড কোডের উত্তরগুলি পোস্ট করবেন না কারণ এটি প্রশ্নের মধ্যে বর্ণিত সমস্যাটি কী ছিল তা ব্যাখ্যা করে না। একটি ভাল উত্তর কি গঠন সম্পর্কে কিছু সাধারণ টিপস জন্য এখানে চেক করুন
জিরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.