(사용되지 않음) 조각 onOptionsItemSelected가 호출되지 않음


82

편집 : 이 질문은 더 이상 사용되지 않는 셜록 작업 표시 줄에 대한 것입니다. 이제 Android 지원 라이브러리를 대신 사용해야합니다.

표시 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);
}

모두에서 캡처 시도 fragmentfragment 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 이벤트가 Fragment에서 호출되지 않았습니다.

검색된 Google은 솔루션을 찾을 수 없으며 FragmentActivity에 onMenuItemSelected 메서드를 추가해도 해결되지 않습니다.

마지막으로 http://developer.android.com/guide/topics/ui/actionbar.html을 참조하여 문제를 해결 하십시오.

참고 : Fragment 클래스의 onCreateOptionsMenu 콜백을 통해 프래그먼트에서 메뉴 항목을 추가 한 경우 사용자가 프래그먼트 항목 중 하나를 선택할 때 시스템은 해당 프래그먼트에 대해 각각의 onOptionsItemSelected () 메서드를 호출합니다. 그러나 액티비티는 이벤트를 먼저 처리 할 기회를 얻으므로 시스템은 프래그먼트에 대해 동일한 콜백을 호출하기 전에 액티비티에서 onOptionsItemSelected ()를 호출합니다.

즉, 액티비티의 onOptionsItemSelected ()에 해당 메뉴 항목 핸들러가없는 경우에만 조각의 onOptionsItemSelected ()가 호출됩니다.

다음과 같은 코드 ----- FragmentActivity 에서 R.action.add 에 대한 처리기를 제거합니다 .)

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

Fragment의 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
나를 위해, 프래그먼트를 클릭하는 메뉴를 가로 채기 위해 FragmentActivity의 onOptionsItemSelected와 프래그먼트의 onOptionsItemSelected에 대해 "false"를 반환하고 원하는 동작을 수행해야했습니다.
에디슨 산토스

1
setHasOptionsMenu (true); 에서 onCreate 공공 부울 onOptionsItemSelected (MenuItem의 항목) {}의 방법은 마법 한
모이 제스

@Felixqk Fragments에 이와 같은 문제가 있습니다. 두 조각이 있습니다. 그러나 조각 2의 OnOptionsSelectedItem이 호출되지 않습니다. 조각 2는 조각 1의 메뉴 옵션을 보여줍니다.
Roon13 dec

@ Roon13 super.onCreateOptionsMenu를 제거합니다. 조각의 onCreateOptionsMenu에서. + setHasOptionsMenu (true); Activity onOptionsItemSelected를 제거하지 않고 나를 위해 일했습니다.
ahmadalibaloch

129

나는 같은 문제가 있었지만 마지막 단계를 요약하고 소개하는 것이 더 낫다고 생각합니다.

  1. setHasOptionsMenu(true)Fragment의 onCreate(Bundle savedInstanceState)메소드에 메소드를 추가하십시오 .

  2. onCreateOptionsMenu(Menu menu, MenuInflater inflater)Fragment의 onOptionsItemSelected(MenuItem item)메서드 ( Fragment 메뉴에서 다른 작업을 수행하려는 경우) 및 메서드를 재정의 합니다 .

  3. Activity의 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);
Youngjae 2014

1
완벽하게 작동합니다. 감사합니다 Marco.
Rajeev Sahu 2014 년

2
좋은 대답입니다. 이 조각에 때 당신의 onCreateOptionsMenu에의 onCreateOptionsMenu (메뉴 메뉴) (메뉴 메뉴, MenuInflater의 인플레이터)을 변경해야합니다
크리스 스프를

1
훌륭한 솔루션입니다. Thnakx 마르코 HC
Darsh 파텔

1
내 친구 훌륭한 솔루션! 감사합니다!
Han Tran 2015 년

5

사람들이 당신에게 준 해결책은 프래그먼트가 아닌 액티비티의 메뉴 항목에 대한 코드를 구현하는 것이 었습니다. 나는 당신이 코드를 조각에 구현했다면 훨씬 더 조직화되어 보일 것이라고 생각합니다. 이렇게하려면 다음과 같이하십시오.

활동

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

이제 줄 (그리고 좋아하는 것) : "return super.onOptionsItemSelected (item);" 활동과 프래그먼트에서 매우 중요합니다. 마치 디버그에서 코드를 따르는 것처럼 메뉴 이벤트 함수가 활동에서 먼저 호출되고 항목이 활동의 ​​스위치에있는 ID와 일치하지 않는 경우 경우, degault 라인 : "super.onOptionsItemSelected (item);" 원하는대로 조각에서 onOptionsItemSelected 함수를 호출합니다. (조각이 많은 경우 호출 계층 구조가 다소 복잡 할 수 있으므로 해당 줄도 포함해야합니다.)


2

나는 actionbarsherlock을 사용하고 있습니다. 이것은 나를 위해 일했습니다.

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는 setHasOptionsMenu (true)를 호출하고 onCreateOptionsMenu를 재정의하고 onOptionsItemSelected도 이와 같이 dummyMenu를 숨 깁니다 (조각에서)

    @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가 작동하지 않는 이유를 알 수 있습니까?
nadeem gc 2014

셜록의 작업 표시 줄이 방법을 사용하지 않는 원인
user1634451

onMenuItemSelected를 onOptionItemSelected를 호출하도록 변경하여 ABS에서 appcompatlib로 이동할 때 코드가 작동하도록합니다
slott

1
@nadeemgc가 작동하지 않는 이유는 Android가 옵션 메뉴와 컨텍스트 메뉴라는 두 가지 유형의 메뉴를 알고 있기 때문입니다. 액션 바 셜록 호출 컨텍스트 메뉴 사용 onContextItemSelected대신을 onOptionsItemSelected. onMenuItemSelected더 나은 일을 표시 왜 올바른 방법, 단순히 전달 클릭.
Amru E. 2015

@AmruE. 앞으로도 도움이 될 것입니다 감사합니다.
nadeem gc

2

작업이 올바르게 수신되는지 확인하기 위해 조각에서 수행하는 것은 매우 간단합니다.

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

0

나는이 문제가 있었다. 내가 잘못된 방법을 무시했기 때문이다.

onOptionsItemSelected (com.actionbarsherlock.view.MenuItem item)는 내가 사용한 것입니다.

올바른 것을 사용하고 있는지 확인하십시오!


0

활동 메서드에서 수퍼 클래스에 연결하지 않습니다. onCreateOptionsMenu ()가 super.onCreateOptionsMenu (menu)를 반환하도록하고 onOptionsItemSelected ()가 super.onOptionsItemSelected (item)를 반환하도록하십시오 (처리중인 항목은 예외이며 이벤트를 처리했음을 나타내려면 true를 반환해야합니다)


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
         ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.