2013-09-01 44 views
1

我管理使用Sherlock ActionBar设置三个标签。唯一的问题是,当方向改变时,标签不能再被点击。看起来像onTabSelected()没有被调用。例如:我处于肖像状态,选择了tab2。我变成了景观。 Tab2仍然被选中,我点击tab3但没有任何反应。然后,当我再次返回肖像时,会显示tab3。我正在测试Android 2.3.6。Sherlock标签不能改变方向

这是主要活动:

public class Activity_Main extends SherlockFragmentActivity { 
    ActionBar.Tab tab1, tab2, tab3; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setTabs(); 
    } 
    void setTabs(){ 
     ActionBar actionBar = getSupportActionBar(); 

     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     tab1 = actionBar.newTab(); 
     tab2 = actionBar.newTab(); 
     tab3 = actionBar.newTab(); 
     tab1.setText("Week"); 
     tab2.setText("Today"); 
     tab3.setText("ToDo"); 

     tab1.setTabListener(new TabListener<Fragment_Start_Week>(this, "week", Fragment_Start_Week.class)); 
     tab2.setTabListener(new TabListener<Fragment_Start_Today>(this, "today", Fragment_Start_Today.class)); 
     tab3.setTabListener(new TabListener<Fragment_Start_Todo>(this, "todo", Fragment_Start_Todo.class)); 
    } 
    private class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener{ 

     private SherlockFragment mFragment; 
     private final Activity mActivity; 
     private final String mTag; 
     private final Class<T> mClass; 
     /** 
     * Constructor used each time a new tab is created. 
     * 
     * @param activity 
     *   The host Activity, used to instantiate the fragment 
     * @param tag 
     *   The identifier tag for the fragment 
     * @param clz 
     *   The fragment's Class, used to instantiate the fragment 
     */ 
     public TabListener(Activity activity, String tag, Class<T> clz) { 
      mActivity = activity; 
      mTag = tag; 
      mClass = clz; 
     } 

     /* The following are each of the ActionBar.TabListener callbacks */ 

     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     SherlockFragment preInitializedFragment = (SherlockFragment) ((FragmentActivity) mActivity).getSupportFragmentManager().findFragmentByTag(mTag); 

     // Check if the fragment is already initialized 
     if (mFragment == null && preInitializedFragment == null) { 
      // If not, instantiate and add it to the activity 
      mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else if (mFragment != null) { 
      // If it exists, simply attach it in order to show it 
      ft.attach(mFragment); 
     } else if (preInitializedFragment != null) { 
      ft.attach(preInitializedFragment); 
      mFragment = preInitializedFragment; 
     } 
    } 

     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      if (mFragment != null) { 
       // Detach the fragment, because another one is being attached 
       ft.detach(mFragment); 
      } 
     } 
     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      // TODO Auto-generated method stub 

     } 
    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 
} 

这是一个片段:

public class Fragment_Start_Week extends SherlockFragment implements OnClickListener{ 

    void create_table() { 
       ... 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) 
    { 
     return inflater.inflate(R.layout.fragment_start_week, group, false); 
    } 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     create_table(); 
    } 

    @Override 
    public void onClick(View view) { 
     ... 

    } 

} 

TIA

+0

你解决了这个问题吗?我很好奇,因为即使我也遇到同样的情况。 –

+0

还没有:(我找不到这个问题的任何帮助,如果你找到任何解决方案,请在这里写下答案。 – evis

回答

1

很多试错后,我已经找到了以下解决方案此bug:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    super.onConfigurationChanged(newConfig); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
} 

诀窍是将导航模式更改为列表,然后切换回制表符。

+0

谢谢!这完美地解决了我的问题! – evis