2013-08-05 41 views
1

我正在使用actionbarsherlock的ActionBar,第一次以橫向或橫向方式運行應用程序時,標籤顯示在Tabs Mode中。將方向更改爲縱向後,導航模式仍處於Tabs。第二次將方向更改爲horizontal時,選項卡將顯示爲List,並且只顯示父項目,其餘部分將隱藏。我聽說這是Android的一個錯誤,如果標籤太多而不適合屏幕,則系統會自動將導航模式更改爲list。但事情是我第一次加載應用程序,即使水平顯示爲tabs模式。順便說一下,我創建了100個標籤配置更改期間的ActionBar導航模式更改

此圖片處於橫向視圖。從頂部的第一個圖像只是將手機的方向更改爲縱向後返回到橫向的結果。
enter image description here


我有這樣的代碼從我清單文件

android:configChanges="orientation|screenSize"

主要活動

public void onConfigurationChanged(Configuration newConfig) { 
     ActionBar ab = getSupportActionBar(); 
      ab.setDisplayShowTitleEnabled(false); 

      if(ab.getNavigationMode() != ActionBar.NAVIGATION_MODE_TABS){ 
       ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

      } 
     super.onConfigurationChanged(newConfig); 
} 

Ĵ烏斯季,以確保我也把代碼,靠近setContentView

 final ActionBar ab = getSupportActionBar(); 
     ab.setDisplayShowTitleEnabled(false); 
     ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

UPDATE地方:

之所以我處理onConfigurationChanged,因爲我有一個空指針異常

logcat的

08-05 15:36:18.486: E/AndroidRuntime(30044): FATAL EXCEPTION: main 
08-05 15:36:18.486: E/AndroidRuntime(30044): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.actionbarsherlock.sample.styled/com.actionbarsherlock.sample.styled.MainActivity}: java.lang.NullPointerException 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3512) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.ActivityThread.access$700(ActivityThread.java:130) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.os.Looper.loop(Looper.java:137) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.ActivityThread.main(ActivityThread.java:4745) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at java.lang.reflect.Method.invoke(Method.java:511) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at dalvik.system.NativeStart.main(Native Method) 
08-05 15:36:18.486: E/AndroidRuntime(30044): Caused by: java.lang.NullPointerException 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.nineoldandroids.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:504) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.nineoldandroids.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:410) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.nineoldandroids.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:538) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:928) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.nineoldandroids.animation.ValueAnimator.start(ValueAnimator.java:951) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.nineoldandroids.animation.ObjectAnimator.start(ObjectAnimator.java:385) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.actionbarsherlock.sample.styled.MainActivity.rotateLeftFrag(MainActivity.java:218) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.actionbarsherlock.sample.styled.MainActivity.onTabSelected(MainActivity.java:256) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.actionbarsherlock.internal.app.ActionBarWrapper$TabWrapper.onTabSelected(ActionBarWrapper.java:356) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:570) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.android.internal.app.ActionBarImpl.setSelectedNavigationItem(ActionBarImpl.java:356) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.android.internal.app.ActionBarImpl.setNavigationMode(ActionBarImpl.java:1158) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.actionbarsherlock.internal.app.ActionBarWrapper.setNavigationMode(ActionBarWrapper.java:216) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.actionbarsherlock.sample.styled.MainActivity.showTabsNav(MainActivity.java:244) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at com.actionbarsherlock.sample.styled.MainActivity.onCreate(MainActivity.java:82) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.Activity.performCreate(Activity.java:5008) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
08-05 15:36:18.486: E/AndroidRuntime(30044): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
08-05 15:36:18.486: E/AndroidRuntime(30044): ... 12 more 
+0

你想在列表中的標籤像你的第一個圖像或在選項卡中像你的第二個圖像? –

+0

我想要第二張圖片,那是我改變方向之前。第一張圖片是結果。 – rahstame

+0

如果您不處理方向更改,會發生什麼情況? – IanB

回答

1

其在Android上的標籤的默認行爲。如果沒有更多空間供橫向/縱向選項卡使用,則會將其轉換爲列表。

現在,如果你仍然想要所有的選項卡不在列表中,那麼我建議看看這個樣本ViewPager之後,你應該將FragmentActivity添加到你的SherlockFragmentActivity中。只需檢查下面的示例代碼,我正在做什麼,這將幫助您使所有標籤具有任何方向。

public class TestSampleTabDefault extends SherlockActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 
    @SuppressLint("NewApi") 
    public static class SampleTabsDefault extends FragmentActivity implements ServiceConnection { 
     private static final String[] CONTENT = new String[] { "Albums", "Artists", "Songs", "Playlist","Genre","Recently Played","Easy Transfer" }; 
     Handler mHandler; 
     //Runnable mRunnable; 
     private ServiceToken mToken; 
     private IRemoteService mIRemoteService; 
     public static ViewPager pager; 
     public static int index = 0; 
     public static android.app.ActionBar mActionBar; 


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

      //getSupportActionBar().setHomeButtonEnabled(true); 
      //ActionBar bar = getSupportActionBar(); 
      //bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
      //bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 

      FragmentPagerAdapter adapter = new GoogleMusicAdapter(getSupportFragmentManager()); 

      pager = (ViewPager)findViewById(R.id.pager); 
      pager.setAdapter(adapter); 

      /*getSupportActionBar().setTitle(name); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);*/ 

      TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator); 
      indicator.setViewPager(pager); 

      index = getIntent().getExtras().getInt("index"); 
      if(index >0){ 
       indicator.setCurrentItem(index); 
      } 

     } 

     class GoogleMusicAdapter extends FragmentPagerAdapter { 
      private final FragmentManager mFragmentManager; 
      private Fragment mFragmentAtPos0; 
      public GoogleMusicAdapter(FragmentManager fm) { 
       super(fm); 
       mFragmentManager = fm; 
      } 
      @Override 
      public Fragment getItem(int position) { 
       // return TestFragment.newInstance(CONTENT[position % CONTENT.length]); 
       Fragment fm = null; 

       if(position==0){// LOAD ALBUMS 
        fm = ArtistList.ArtistListFragment.newInstance(); 
        return fm; 

       }else if(position==1){// LOAD ARTISTS 
        //Toast.makeText(getApplicationContext(), "Select Album", Toast.LENGTH_SHORT).show(); 
        fm = ArtistList.ArtistListFragment.newInstance(); 
        return fm; 
       }else if(position==2){// LOAD SONGS 
        fm = SongsList.SongsListFragment.newInstance(); 
        return fm; 
       }else if(position==3){ // PLaylist 
        fm = PlaylistList.PlayListFragment.newInstance(); 
        return fm; 
       }else if(position==4){ // Genre List 
        fm = GenreList.GenreListFragment.newInstance(); 
        return fm; 
       }else if(position==5){ // Recent List 
        fm = RecentAddedList.RecentListFragment.newInstance(); 
        return fm; 
       }else{ 
        fm = TestFragment.newInstance(CONTENT[position]); 
       } 
       return fm; 


      } 

      @Override 
      public CharSequence getPageTitle(int position) { 
       return CONTENT[position % CONTENT.length].toUpperCase(); 
      } 

      @Override 
      public int getCount() { 
       return CONTENT.length; 
      } 

      @Override 
      public int getItemPosition(Object object) 
      { 
       if (object instanceof AlbumListFragment && mFragmentAtPos0 instanceof TestFragment) 
        return POSITION_NONE; 
       return POSITION_UNCHANGED; 
      } 

     } 

    } 
} 

希望這會對你有幫助。祝一切順利。如果您遇到任何困難,請告訴我。

+0

不錯的工作:),尋呼機是一個好主意,而不是;) – PiyushMishra

+0

我已經習慣了以前的例子,讓我試試。謝謝! – rahstame