2016-11-04 4 views
1

두 개의 액티비티가있는 프래그먼트를 호스팅하는 응용 프로그램이 있습니다. 내 주요 활동 하나의 조각을 호스팅하고 조각을 정의하고 도구 모음에 아무 문제없이 이동 메뉴를 팽창시킬 수 있습니다.조각의 onCreateOptionsMenu 메서드가 호출되지 않습니다

그러나 두 번째 활동에서는 항목간에 가로 스크롤을 허용하기 위해 FragmentStatePagerAdapter을 사용하지만 제 조각은 도구 모음에서 메뉴를 정의 할 수없는 것 같습니다.

수표 :

  • 내 전체 응용 프로그램은 a theme (android:theme="@style/AppTheme") based onTheme.AppCompat.Light.DarkActionBar를 사용하도록 설정되어 있습니다.
  • 내 조각 android.support.v4.app.Fragment
  • setHasOptionsMenu(true);이 조각의 onCreate() 방법에서 called입니다 확장
  • hosting activityAppCompatActivity를 확장하고
  • 나의 단편 overridesvoid onCreateOptionsMenu(Menu, MenuInflater), 하지만이 방법은 같다가 호출되지 않을 수
  • 도구 모음 메뉴 자체를 구현하지 않습니다

You can have a look at the commit that is supposed to add that menu on GitHub. .

CrimeFragment.java :

public class CrimeFragment extends Fragment { 

    // ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d(TAG, "onCreate()"); 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
     UUID id = (UUID) getArguments().getSerializable(ARG_CRIME_ID); 
     Log.d(TAG, String.format("Crime id in intent's extra: %s", id.toString())); 
     mCrime = CrimeLab.get(getActivity()).getCrime(id); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     Log.d(TAG, "onCreateOptionsMenu()"); // <= Never shows in the Android Monitor 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.fragment_crime, menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_item_delete_crime: 
       CrimeLab.get(getActivity()).deleteCrime(mCrime); 
       getActivity().finish(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    // ... 
} 

뭔가 거기에 내가 잘못 여기하고있어 오류의 원인이 될 수있는 코드의 어떤 부분에서 확인) 여기

큰 라인은 무엇입니까?

+0

단편 메뉴를 사용하려면 onPrepareOptionMenu() 메소드를 사용해야합니다. –

+0

@Divyesh 고맙습니다. 불행히도, 내 조각에서 ('s' :'onPrepareOptionsMenu'를 사용하여) 그 메소드를 오버라이드 (override)하려고 시도한 후에도, 호출되지 않습니다. –

+0

두번째 Activity는 메뉴 항목을 정의했는지 여부를 결정합니까? –

답변

0

그래, 시간이 좀 걸렸지 만 마침내 내 코드에 문제가 있다는 것을 발견했습니다. 이것은 약간 까다 롭습니다.

earlier change에서 나는 사용자가 페이지를 전환 할 때마다 알려주기 위해 호스팅 활동에서 FragmentStatePagerAdapter#setPrimaryItem()을 오버로드합니다.

불행히도이 오버라이드에서는 super에 전화하는 것을 잊어 버렸습니다. 그게 분명히 응용 프로그램을 혼란스럽게 만들었습니다.

방금 ​​add that call to super에 있어야했고, 내 메뉴 항목이 갑자기 나타나기 시작했습니다.

public class CrimePagerActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_crime_pager); 
     // ... 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) { 
      // ... 

      @Override 
      public void setPrimaryItem(ViewGroup container, int position, Object object) { 
       super.setPrimaryItem(container, position, object); // <= This line was missing 
       Crime crime = mCrimes.get(position); 
       mChangedCrimeIds.add(crime.getId()); 
      } 
     }); 
     mViewPager.setCurrentItem(CrimeLab.get(this).getPosition(crimeId)); 
    } 
    // ... 
} 
관련 문제