2013-05-27 78 views
2

我使用ActionBarSherlock,而我的主要活動有一個帶有三頁的ViewPager,它們都是片段。其中一個片段有onCreateOptionsMenu方法,主活動中的操作欄會正確更新。這裏的方法:從延遲後顯示的ViewPager片段的動作欄項目

public void onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu, com.actionbarsherlock.view.MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.search, menu); 
    // A couple of other things 
} 

我使用自定義FragmentPagerAdapter

public class SectionsPagerAdapter extends FragmentPagerAdapter { 
    FragmentManager fm; 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
     this.fm = fm; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
     case 0: 
      accountFragment = Account.newInstance(); 
      return accountFragment; 
     case 1: 
      filesFragment = Files.newInstance(); 
      return filesFragment; 
     case 2: 
      transfersFragment = Transfers.newInstance(); 
      return transfersFragment; 
     } 
     return null; 
    } 

    private String makeFragmentName(int viewId, int index) { 
     return "android:switcher:" + viewId + ":" + index; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
     case 0: 
      return titleAccount; 
     case 1: 
      return titleFiles; 
     case 2: 
      return titleTransfers; 
     } 
     return null; 
    } 
} 

我沒有任何代碼都在我的活動,呼籲supportInvalidateOptionsMenu,所以我假設的框架檢查片段選項菜單對我來說,但我不喜歡它是如何做到的。這就是我的意思是:

the problem

股票應用程序(電話,人等)以及一些其他的應用程序正確地做到這一點。也就是說,只要我扔到頁面上,就會顯示新頁面的菜單項。但在我的,它們只在滑動動畫結束時顯示。

這裏的東西我已經試過:

pager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int arg0) { 
      supportInvalidateOptionsMenu(); 
     } 
     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) {} 
     @Override 
     public void onPageScrollStateChanged(int arg0) {} 
    }); 

這似乎什麼也不做。

記錄顯示onPageSelected在我滑動到另一個頁面時被調用,這是我想要要更新的項目。記錄我的片段的onCreateOptionsMenu表明它只在動畫結束時被調用,與調用onPageSelected相比,它有相當大的延遲。

我該如何解決這個問題?

回答

1

股票應用程序(電話,人等),以及一些其他應用程序正確做到這一點。也就是說,只要我扔到頁面上,就會顯示新頁面的菜單項。但在我的,它們只在滑動動畫結束時顯示。

我無法在運行4.2.2的Galaxy Nexus上通過手機重現您的行爲。在那裏,操作欄不會改變,直到新頁面完全可見時,無論它是一個或一個滑動。

通過聯繫人,我看到了你所看到的,因爲當手指擡起時,動作欄會發生變化,所以在一個動作中,變化發生得更快。

坦率地說,我認爲你是在一座小山上劃出一座山。話雖如此,但我可以看到複製聯繫人行爲的唯一方法是完全重新實現FragmentPagerAdapter,從setPrimaryItem()中刪除setMenuVisibility()調用,然後安排在您認爲更合適的時間進行調用。

+1

你說的對,電話,我的錯!我想我感到困擾的是,我看到很多第三方應用程序(我無法想象)沒有這個問題。我覺得我在某個地方錯過了一個愚蠢的小電話。 –