(Kullanımdan Kaldırıldı) onOptionsItemSelected Fragment çağrılmıyor


82

DÜZENLEME: Bu soru, kullanımdan kaldırılan sherlock eylem çubuğu içindi. Onun yerine şimdi Android destek kitaplığı kullanılmalıdır

Benim için fragmentgörünen paylaşım adında bir işlem çubuğu menü seçeneği ekledim, ancak seçim etkinliği yakalanmıyor

Böyle ekliyorum

@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);
}

Onu hem aynı fragmenthem de fragment activitybenzer şekilde yakalamaya çalışıyorum

@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);
    }
}

ve setHasOptionsMenu(true);içinde var onCreate().

Yanıtlar:


145

Bana da aynı sorunlar oldu:

onMenuItemSelected olaylar Fragment'te çağrılmadı

Arama yapılan google bir çözüm bulamıyor ve FragmentActivity'de onMenuItemSelected yöntemini eklemek sorunu çözmüyor.

Son olarak http://developer.android.com/guide/topics/ui/actionbar.html adresine başvurarak sorunu çözün

Not: Menü öğesini Fragment sınıfının onCreateOptionsMenu geri araması aracılığıyla bir parçadan eklediyseniz, kullanıcı parçanın öğelerinden birini seçtiğinde sistem bu parça için ilgili onOptionsItemSelected () yöntemini çağırır. Bununla birlikte, etkinlik önce olayı işleme şansı elde eder, bu nedenle sistem, parça için aynı geri aramayı çağırmadan önce etkinlik üzerinde onOptionsItemSelected () öğesini çağırır.

Bu, yalnızca etkinlik üzerindeki onOptionsItemSelected () içinde o menü öğesi işleyicisine sahip değilseniz, parçadaki onOptionsItemSelected () çağrılacağı anlamına gelir.

Aşağıdaki gibi kodlayın ----- FragmentActivity'de R.action.add için işleyiciyi kaldırın ):

@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);
    }   
}

Ve Fragment üzerindeki R.action.add işleyicisi şuna benzer:

@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);
    }
}

Son olarak eklemeyi unutmayın

    setHasOptionsMenu(true);

Fragment'teki onCreate yönteminizde


12
Benim için, parça üzerindeki menü tıklamasını engellemek için, FragmentActivity onOptionsItemSelected üzerinde "false" döndürmem ve parçanın onOptionsItemSelected üzerinde istenen davranışı yapmam gerekiyordu.
Edison Santos

1
setHasOptionsMenu (true) ile parça; in onCreate ve public boolean onOptionsItemSelected (MenuItem öğesi) {} yöntemi sihir yaptı
Moisés,

@Felixqk Fragments ile böyle bir sorun yaşıyorum. İki parçam var. Ancak 2. parçanın OnOptionsSelectedItem öğesi çağrılmıyor. Parça 2, parça 1'in menü seçeneğini gösteriyor.
Roon13

@ Roon13 super.onCreateOptionsMenu öğesini kaldırın; parçanın onCreateOptionsMenu'sinden. + setHasOptionsMenu (doğru); Activity onOptionsItemSelected kaldırmadan benim için çalıştı.
ahmadalibaloch

129

Ben de aynı sorunu yaşadım, ancak bence işe yaraması için son adımı özetlemek ve tanıtmak daha iyi:

  1. setHasOptionsMenu(true)Fragment yönteminize yöntem ekleyin onCreate(Bundle savedInstanceState).

  2. onCreateOptionsMenu(Menu menu, MenuInflater inflater)Fragment'inizdeki (Parçanızın menüsünde farklı bir şey yapmak istiyorsanız) ve onOptionsItemSelected(MenuItem item)yöntemleri geçersiz kılın .

  3. Aktivitenizin onOptionsItemSelected(MenuItem item)yönteminin içinde, falsemenü öğesi eylemi Fragment onOptionsItemSelected(MenuItem item)yönteminde uygulanacağı zaman geri döndüğünüzden emin olun .

Bir örnek:

Aktivite

@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;
}

Fragman

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 falseEtkinliğin onOptionItemSelectedanahtarıdır. sadece değiştirinreturn super.onOptionItemSelected(item);
Youngjae

1
Mükemmel çalışıyor. Teşekkürler Marco.
Rajeev Sahu

2
Mükemmel cevap. Bir parçanın içindeyken onCreateOptionsMenu (Menü menüsü) onCreateOptionsMenu (Menü menüsü, MenuInflater şişirici) olarak değiştirmelisiniz
Chris Sprague

1
Harika bir çözüm. Thnakx Marco HC
Darsh Patel

1
Harika çözüm arkadaşım! Teşekkürler
Han Tran

5

İnsanların size verdiği çözümün, menü öğeniz için kodu parçadan ziyade aktivitede uygulamak olduğunu fark ettim. Bence, kodu aktiviteden ziyade fragmana uygulamış olsaydınız çok daha organize görünecektir çünkü bence daha iyi görünüyor. Bunu yapmak için aşağıdakileri yapın:

Aktivite

@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;
    }

Fragman

 @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;
        }

Şimdi satırlar (ve beğeniler): "return super.onOptionsItemSelected (öğe);" etkinlik ve parçadaki kod çok önemlidir, çünkü hata ayıklamada kodu takip edecekmişsiniz gibi, menü olayları işlevlerinin ilk olarak Etkinlik'te çağrılacağını ve öğenin etkinlik anahtarındaki id'lerle eşleşmediğini göreceksiniz. durumda, degault satırı: "super.onOptionsItemSelected (öğe);" onOptionsItemSelected işlevini istediğimiz gibi parça üzerinde çağıracağız. (Eğer birçok parçanız varsa, çağıran hirarşi biraz karmaşık olabileceğinden, içlerinde bu satırın da bulunduğundan emin olun).


2

Actionbarsherlock kullanıyorum. Bu benim için çalıştı:

1) dummy_menu.xml menüsü oluşturun

<?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) Aktivitede menüyü şu şekilde şişirin:

@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 fragmanlarında setHasOptionsMenu (true) çağrısı ve override onCreateOptionsMenu ve onOptionsItemSelected da dummyMenu'yu bu şekilde gizleyin (fragment içinde)

    @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);
}

Umarım birine yardımcı olur.


2

Actionbar sherlock kullanımı için düzenle

Kullanmak zorundaydım

public boolean onMenuItemSelected(int featureId, MenuItem item) {

ana aktivitede menü öğesini yakalamak için


Aynı sorun ve benim için de düzeltildi teşekkürler. OnOptionItemSelected'ın neden çalışmadığını söyleyebilir misiniz?
nadeem gc

Sherlock eylem çubuğu bu yöntemi kullanmadığından
user1634451

Appcompatlib ABS'nin geçerken kodunuzu çalışacaktır böylece Değişim onOptionItemSelected çağrı için onMenuItemSelected
slott

1
@nadeemgc çalışmamasının nedeni Android'in iki tür menüden haberdar olmasıdır: Seçenekler Menüsü ve Bağlam Menüsü. Actionbar Sherlock, bunun onContextItemSelectedyerine çağıran Bağlam Menüsünü kullanır onOptionsItemSelected. onMenuItemSelectedDaha iyi çalışması için görünür yüzden doğru yöntemle, basitçe ileri tık.
Amru E.

@AmruE. Teşekkür ederim gelecekte faydalı olacak.
nadeem gc

2

O kadar basit ki, eyleminizin doğru şekilde dinlediğinden emin olmak için bunu parçanızda yapabilirsiniz:

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

0

Bu sorunu yaşadım. Yanlış yöntemi aştığım için

onOptionsItemSelected (com.actionbarsherlock.view.MenuItem öğesi) kullandım.

Doğru olanı kullandığınızdan emin olun!


0

Etkinlik yöntemlerinde üst sınıfa zincirlemezsiniz. Lütfen onCreateOptionsMenu () dönüş super.onCreateOptionsMenu (menu) ve onOptionsItemSelected () dönüş super.onOptionsItemSelected (öğe) olsun (işlemekte olduğunuz öğe hariç, olayı işlediğinizi belirtmek için true dönmesi gerekir)


0

bu kodu eklemelisin toolbar.bringToFront(); sonraki set araç çubuğunu aktivitenize

 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
         ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.