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

편집 :
이 질문은 더 이상 사용되지 않는 셜록 작업 표시 줄에 대한 것입니다. 이제 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().



답변

나에게도 같은 문제가 발생했습니다.

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 메서드에서


답변

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

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


답변

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

활동

@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 함수를 호출합니다. (조각이 많은 경우 호출 계층 구조가 다소 복잡 할 수 있으므로 해당 줄도 포함해야합니다.)


답변

나는 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);
}

누군가에게 도움이되기를 바랍니다.


답변

액션 바 셜록 사용을위한 편집

나는 사용해야했다

public boolean onMenuItemSelected(int featureId, MenuItem item) {

메뉴 항목을 캡처하기 위해 기본 활동에서


답변

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

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


답변

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

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

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