2016-11-04 24 views
1

我有一個應用程序與兩個活動主持片段。我的主要活動託管一個片段,並且該片段能夠定義並膨脹工具欄中的菜單,沒有問題。片段的onCreateOptionsMenu方法從來沒有被調用

雖然在第二個活動中,它使用FragmentStatePagerAdapter來允許項目之間的水平滾動,但我的片段似乎無法在工具欄中定義菜單。

檢查:

  • 我的整個應用程序設置爲使用a themeandroid:theme="@style/AppTheme"based onTheme.AppCompat.Light.DarkActionBar
  • 我的片段延伸android.support.v4.app.Fragment
  • setHasOptionsMenu(true);是從片段的onCreate()方法called
  • hosting activity延伸AppCompatActivity並沒有實現工具欄菜單本身
  • 我的片段overridesvoid onCreateOptionsMenu(Menu, MenuInflater)但這種方法似乎從來不會被調用

You can have a look at the commit that is supposed to add that menu on GitHub.(or even lo 。確定的代碼,可能是錯誤的原因的任何部分)

這裏是大線:

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'),它也不會被調用... –

+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)); 
    } 
    // ... 
} 
相關問題