2013-07-31 31 views
0

我想在Android中使用ActionBarSherlock選項卡視圖。它只是一個包含3個選項卡的演示項目,每個選項卡只顯示一個包含textview的片段。這是我的MainActivity代碼:在Actionbar sherlock,添加選項卡拋出:提交已調用

public class MainActivity extends SherlockFragmentActivity { 

private ActionBar mActionBar; 
private Tab tab1; 
private Tab tab2; 
private Tab tab3; 

@Override 
protected void onCreate(Bundle arg0) { 
    super.onCreate(arg0); 
    setContentView(R.layout.activity_main); 
    mActionBar = getSupportActionBar(); 
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    tab1 = mActionBar.newTab().setText("TAB1"); 
    tab2 = mActionBar.newTab().setText("TAB2"); 
    tab3 = mActionBar.newTab().setText("TAB3"); 

    tab1.setTabListener(new TabSelectListener(FragmentTest 
      .newInstance("Fragment1"), R.id.container)); 
    tab2.setTabListener(new TabSelectListener(FragmentTest 
      .newInstance("Fragment2"), R.id.container)); 
    tab3.setTabListener(new TabSelectListener(FragmentTest 
      .newInstance("Fragment3"), R.id.container)); 

    mActionBar.addTab(tab1); 
    mActionBar.addTab(tab2); 
    mActionBar.addTab(tab3); 

} 

private class TabSelectListener implements TabListener { 

    private SherlockFragment mFragment; 
    private int resId; 

    public TabSelectListener(SherlockFragment fragment, int resId) { 
     mFragment = fragment; 
     this.resId = resId; 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    Log.e("Listener", "onTabSelected"); 
    ft.replace(resId, mFragment).commit(); 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     Log.e("Listener", "onTabUnselected"); 
     // ft.remove(mFragment).commit(); 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     Log.e("Listener", "onTabReselected"); 
    } 

} 

} 

//This is my FragmentTest 
public class FragmentTest extends SherlockFragment { 
private String name; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment, container, false); 
    TextView textView = (TextView) view.findViewById(R.id.tvText); 
    textView.setText("" + name); 
    return view; 
} 

public static SherlockFragment newInstance(String s) { 
    return new FragmentTest().setName(s); 
} 

public String getName() { 
    return name; 
} 

public FragmentTest setName(String name) { 
    this.name = name; 
    return this; 
} 

} 

上面的代碼會導致我的應用程序force close有:commit already called錯誤。我搜索了很多教程,但沒有線索。任何人都可以爲我解釋和解決它嗎?非常感謝你!

回答

1

我知道這是一個老問題,但由於沒有給出答案,在這裏。變化:

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    Log.e("Listener", "onTabSelected"); 
    ft.replace(resId, mFragment).commit(); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    Log.e("Listener", "onTabSelected"); 
    ft.replace(resId, mFragment); 
} 

的FragmentTransaction將自動獲得COMMITED,從而明確地調用.commit()將拋出你遇到的錯誤。

相關問題