(पदावनत) खंडित ओन्यूशंस इटेम सेलेक्ट नहीं किया जा रहा है


82

EDIT: यह प्रश्न हटाए गए शर्लक एक्शन बार के लिए था। अब इसके बजाय एंड्रॉइड सपोर्ट लाइब्रेरी का उपयोग किया जाना चाहिए

मैंने एक एक्शन बार मेनू विकल्प जोड़ा है जिसे मेरे लिए शेयर कहा जाता है fragmentजो प्रकट होता है लेकिन चयन ईवेंट को पकड़ा नहीं जा रहा है

मैं इसे इस तरह से जोड़ रहा हूं

@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    MenuItem item = menu.add(0, 7,0, R.string.share);
    item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}

इसे fragmentऔर fragment activityपसंद दोनों में कैद करने की कोशिश की जा रही है

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case 7:
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("text/plain");
            share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
            startActivity(Intent.createChooser(share, "Share Text"));
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

और मैं setHasOptionsMenu(true);में onCreate()

जवाबों:


145

मेरे साथ भी ऐसी ही समस्याएँ हुईं:

onMenuItemSelected ईवेंट को फ़्रैगमेंट में नहीं कहा जाता है

खोजा गया Google कोई समाधान नहीं ढूंढ सकता है, और FragmentActivity में onMenuItemSelected पद्धति को नहीं जोड़ सकता है।

अंत में इसे http://developer.android.com/guide/topics/ui/actionbar.html के संदर्भ में हल करें

नोट: यदि आपने फ्रैगमेंट वर्ग के onCreateOptionsMenu कॉलबैक के माध्यम से एक टुकड़े से मेनू आइटम को जोड़ा है, तो सिस्टम उस टुकड़े के लिए संबंधित onOptionsItemSelected () विधि को कॉल करता है जब उपयोगकर्ता टुकड़ा के किसी एक आइटम का चयन करता है। हालांकि गतिविधि को पहले घटना को संभालने का मौका मिलता है, इसलिए सिस्टम खंड के लिए एक ही कॉलबैक को कॉल करने से पहले गतिविधि पर onOptionsItemSelected () कॉल करता है।

जिसका मतलब केवल तभी है जब आपके पास गतिविधि में onOptionsItemSelected () पर मेनू आइटम हैंडलर नहीं है, टुकड़े पर OnOptionsItemSelected () कहा जाएगा।

निम्नलिखित के रूप में कोड ----- R.action.add पर FragmentActivity के लिए हैंडलर निकालें ):

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            popBackStack();             
            return true;        
        case R.id.action_search:
            searchAction();
            return true;
        case R.id.action_logout:
            userLogout();
            return true;
        //case R.id.action_add:
            //return true;    
        default:
            return super.onOptionsItemSelected(item);
    }   
}

और फ्रेगमेंट पर R.action.add के लिए हैंडलर इस तरह दिखता है:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d("onOptionsItemSelected","yes");
    switch (item.getItemId()) {
        case R.id.action_add:
            add();
            return true;    
        default:
            return super.onOptionsItemSelected(item);
    }
}

अंत में, जोड़ना याद रखें

    setHasOptionsMenu(true);

Fragment में अपने onCreate मेथड में


12
मेरे लिए, खंड पर मेनू क्लिक को इंटरसेप्ट करने के लिए, मुझे फ्रैगमेंटएक्टिविटी के onOptionsItemSelected और टुकड़े के OnOptionsItemSelected पर वांछित व्यवहार करना है।
एडिसन सैंटोस

1
समुच्चय के साथ खंड .Menu (सच); onCreate और सार्वजनिक बूलियन onOptionsItemSelected (MenuItem आइटम) {} विधि ने जादू किया
Moisés

@Felixqk मुझे इस तरह की समस्याएँ आ रही हैं। मेरे दो टुकड़े हैं। लेकिन खंड 2 के OnOptionsSelectedItem को नहीं बुलाया जा रहा है। टुकड़ा 2 टुकड़ा 1 के मेनू विकल्प दिखा रहा है।
Roon13

@ Roon13 Super.onCreateOptionsMenu निकालें; टुकड़े के onCreateOptionsMenu से। + setHasOptionsMenu (सच); गतिविधि onOptionsItemSelected को हटाए बिना मेरे लिए काम किया।
अहमादालिबालोच

129

मुझे भी यही समस्या थी, लेकिन मुझे लगता है कि इसे काम में लाने के लिए अंतिम चरण को संक्षेप में प्रस्तुत करना और प्रस्तुत करना बेहतर है:

  1. setHasOptionsMenu(true)अपने फ्रैगमेंट की विधि में विधि जोड़ें onCreate(Bundle savedInstanceState)

  2. ओवरराइड onCreateOptionsMenu(Menu menu, MenuInflater inflater)(यदि आप अपने Fragment के मेनू में कुछ अलग करना चाहते हैं) और onOptionsItemSelected(MenuItem item)अपने Fragment में तरीके।

  3. अपनी गतिविधि के onOptionsItemSelected(MenuItem item)तरीके के अंदर , सुनिश्चित करें कि आप वापस लौट आएfalse उस समय जब मेनू आइटम क्रिया को Fragment की onOptionsItemSelected(MenuItem item)विधि में लागू किया जाएगा ।

एक उदाहरण:

गतिविधि

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Do Activity menu item stuff here
        return true;
    case R.id.fragment_menu_item:
        // Not implemented here
        return false;
    default:
        break;
    }

    return false;
}

टुकड़ा

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    ....
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Not implemented here
        return false;
    case R.id.fragment_menu_item:
        // Do Fragment menu item stuff here
        return true;
    default:
        break;
    }

    return false;
}

6
return falseगतिविधि की onOptionItemSelectedकुंजी है। बस बदलेंreturn super.onOptionItemSelected(item);
यंगजई

1
पूरी तरह से काम करना। धन्यवाद मार्को।
राजीव साहू

2
बहुत बढ़िया जवाब। जब आप एक टुकड़े में हो तो आपको onCreateOptionsMenu (मेनू मेनू) को onCreateOptionsMenu (मेनू मेनू, MenuInflater इनफ़्लो) में परिवर्तित करना चाहिए
क्रिस स्प्रैग

1
यह महान समाधान है। थैंकक्स मार्को एचसी
पटेल

1
महान समाधान मेरे दोस्त! Thankssss!
हान

5

मैंने देखा है कि लोगों ने आपको जो समाधान दिया था, वह उस गतिविधि के बजाय आपके मेन्यू आइटम के कोड को लागू करना था। मुझे लगता है कि यह बहुत अधिक orgenized होगा यदि आपने खंड में कोड को लागू किया था, तो मेरे विचार में गतिविधि 'cos' बेहतर है। ऐसा करने के लिए, निम्नानुसार करें:

गतिविधि

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

 @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {            
        switch (item.getItemId())
        {
            case R.id.SomeIDInTheMenueOfTheActivity:
            {
               //something();
                break;
            }
            default:
             //do something default and add the code under : 
             return super.onOptionsItemSelected(item);
        }
        return true;
    }

टुकड़ा

 @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);  
            setHasOptionsMenu(true);      
        }

  @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {           
        super.onCreateOptionsMenu(menu, inflater);
    }

     @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            switch (item.getItemId())
            {           
                case R.id.SomeIDInFragmentMenue:
                {             
                    break;
                }

                default:
                    return super.onOptionsItemSelected(item);
            }

            return true;
        }

अब लाइनें (और पसंद): "सुपर पर वापस जाएँ। ItOptionsItemSelected (आइटम);" गतिविधि में और टुकड़ा सुपर महत्वपूर्ण हैं, क्योंकि जैसे कि आप डिबग में कोड का पालन करेंगे, आप देखेंगे कि मेन्यू ईवेंट फ़ंक्शन को पहले गतिविधि पर बुलाया जाएगा, और यदि आइटम गतिविधि के स्विच में आईडी से मेल नहीं खाता- मामला, डीगॉल्ट लाइन: "सुपर.ऑन्यूशंस इटेम सेलेक्टेड (आइटम);" OnOptionsItemSelected फ़ंक्शन को खंड पर कॉल करेगा, जैसा कि हम चाहते थे। (यदि आपके पास कई टुकड़े हैं, तो सुनिश्चित करें कि उनमें वह रेखा भी हो, क्योंकि कॉलिंग पदानुक्रम कुछ जटिल हो सकता है)।


2

मैं एक्शनबारलॉक का उपयोग कर रहा हूं। यह मेरे लिए काम किया:

1) dummy_menu.xml मेनू बनाएँ

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" >
<item
      android:title=""
      android:showAsAction="never"
      android:id="@+id/dummyMenu"
        />

2) गतिविधि में इस तरह से मेनू फुलाएँ:

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
   inflater.inflate(R.menu.dummy_menu,menu);
   return super.onCreateOptionsMenu(menu);
}

3) टुकड़ों में onCreateView call setHasOptionsMenu (सच) और override

    @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_actions, menu);
    MenuItem item = menu.findItem(R.id.dummyMenu);
    item.setVisible(false);
    super.onCreateOptionsMenu(menu, inflater);
}

आशा है कि यह किसी की मदद करता है।


2

एक्शनबार शर्लक उपयोग के लिए संपादित करें

मुझे इस्तेमाल करना था

public boolean onMenuItemSelected(int featureId, MenuItem item) {

मेन आइटम को कैप्चर करने के लिए मुख्य गतिविधि में


एक ही समस्या है और यह मेरे लिए भी तय धन्यवाद। क्या आप बता सकते हैं कि onOptionItemSelected ने काम क्यों नहीं किया?
नदीम जीसी

कारण शर्लक एक्शन बार इस पद्धति का उपयोग नहीं करता है
user1634451

बदलें onMenuItemSelected on onOptionItemSelected ताकि आपका कोड तब काम करेगा जब ABS से appcompatlib में जा रहा हो
slott

1
@nadeemgc इसका कारण यह नहीं है क्योंकि एंड्रॉइड दो प्रकार के मेनू के बारे में जानता है: विकल्प मेनू और संदर्भ मेनू। एक्शनबार शरलॉक कॉन्टेक्स्ट मेनू का उपयोग करता है, जो onContextItemSelectedइसके बजाय कॉल करता है onOptionsItemSelectedonMenuItemSelectedबस आगे सही विधि है, जिसके कारण यह बेहतर काम करने के लिए प्रकट होता है करने के लिए क्लिक करें।
अमरू ई।

@AmruE। धन्यवाद यह भविष्य में मददगार होगा।
नदीम जीसी

2

यह इतना सरल है कि आप अपने टुकड़े में यह सुनिश्चित कर सकते हैं कि आपकी कार्रवाई सही ढंग से सुनेगी:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

0

मुझे यह समस्या थी। ऐसा इसलिए था क्योंकि मैं गलत तरीके से आगे बढ़ रहा था

onOptionsItemSelected (com.actionbarsherlock.view.MenuItem आइटम) जो मैंने उपयोग किया है।

सुनिश्चित करें कि आप सही का उपयोग कर रहे हैं!


0

आप गतिविधि के तरीकों में सुपरक्लास का पीछा नहीं कर रहे हैं। कृपया onCreateOptionsMenu () वापसी super.onCreateOptionsMenu (मेनू), और onOptionsItemSelected () वापसी super.onOptionsItemSelected (आइटम) (उस आइटम को छोड़कर जो आप संभाल रहे हैं, जो यह इंगित करने के लिए सही होना चाहिए कि आपने घटना को संभाला है)


0

आपको toolbar.bringToFront();अपनी गतिविधि में इस कोड को अगला सेट टूलबार जोड़ना होगा

 public class MainActivity extends AppCompatActivity {
     protected void onCreate(Bundle savedInstanceState) {
        ...

        Toolbar toolbar = findViewById(R.id.toolbar);
        toolbar.setTitle("Yazd");
        setSupportActionBar(toolbar);
        toolbar.bringToFront(); // <<= add here
         ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.