0

我以前做过这样的事情,这是一个超级简单的例子,但我似乎无法使用 actionbarsherlock v4.1 让它工作。

这是主要活动

public class VanityActivity extends SherlockFragmentActivity {



/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        //restore
    }

    com.actionbarsherlock.app.ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    com.actionbarsherlock.app.ActionBar.Tab tab1 = actionBar.newTab();
    tab1.setText("Website");
    tab1.setTabListener(new HeaderTabListener(getApplicationContext()));
    tab1.setTag(1);
    actionBar.addTab(tab1);

    com.actionbarsherlock.app.ActionBar.Tab tab2 = actionBar.newTab();
    tab2.setText("Portfolio");
    tab2.setTabListener(new HeaderTabListener(getApplicationContext()));
    tab2.setTag(2);
    actionBar.addTab(tab2);

    com.actionbarsherlock.app.ActionBar.Tab tab3 = actionBar.newTab();
    tab3.setText("Team");
    tab3.setTabListener(new HeaderTabListener(getApplicationContext()));
    tab3.setTag(3);
    actionBar.addTab(tab3);

}


}

还有我的 HeaderTabListener 类:

public class HeaderTabListener implements   

com.actionbarsherlock.app.ActionBar.TabListener {

private Context context;

public HeaderTabListener(Context context){
    this.context = context; 
}

@Override
public void onTabSelected(com.actionbarsherlock.app.ActionBar.Tab tab, android.support.v4.app.FragmentTransaction ft) {
    int i=((Integer)tab.getTag()).intValue();
    if(tab.getPosition()==0){
        ft.replace(android.R.id.content, CompanyFragment.newInstance(i));
    }else if(tab.getPosition()==1){

        ft.replace(android.R.id.content, PortfolioFragment.newInstance(i));
    }
}

@Override
public void onTabUnselected(com.actionbarsherlock.app.ActionBar.Tab tab, android.support.v4.app.FragmentTransaction ft) {
    Log.v("Tab selected", tab.getText().toString());

}

@Override
public void onTabReselected(com.actionbarsherlock.app.ActionBar.Tab tab, android.support.v4.app.FragmentTransaction ft) {
    Log.v("Tab selected2", tab.getText().toString());
}

}

最后是其中一个片段(两个片段相同,但每个布局中的文本不同)

public class PortfolioFragment extends SherlockFragment {
  private static final String KEY_POSITION="position";
  private static final String KEY_TEXT="text";

  static PortfolioFragment newInstance(int position) {
    PortfolioFragment frag=new PortfolioFragment();
    Bundle args=new Bundle();

    args.putInt(KEY_POSITION, position);

    frag.setArguments(args);

    return(frag);
  }

  @Override
  public View onCreateView(LayoutInflater inflater,
                           ViewGroup container,
                           Bundle savedInstanceState) {
    View result=inflater.inflate(R.layout.fragment_portfolio, container, false);

    int position=getArguments().getInt(KEY_POSITION, -1);
    return(result);
  }
}

因此,当它第一次加载选项卡时,所有选项卡都正确显示,第一个选项卡突出显示并显示 CompanyFragment 布局中的文本。但是后来我无法单击任何其他选项卡来更改内容,并且我在 onTabSelected 中的日志永远不会被调用。有什么想法吗?谢谢阅读。

4

1 回答 1

0

首先,让我告诉你,我没有使用 ActionBarSherlock 的经验。我查看了您的代码以获取有关我的应用程序的一些想法。自从您几个月前发布以来,由于没有人回答,我想分享我的第一印象。

据我所知,ActionBarSherlock 公开了与最新的 Android API 相同的功能。因此,我确实认为您缺少一个简单的方法调用。替换片段后,您需要调用commit()Android 开发人员指南参考)。因此,更改行,以及所有类似的行;

ft.replace(android.R.id.content, PortfolioFragment.newInstance(i));ft.replace(android.R.id.content, PortfolioFragment.newInstance(i)).commit();.

我希望这能解决您的问题,尽管我确实意识到您声明永远不会调用 ònTabSelected() 方法。然而,如果不调试,问题之间的差异似乎是透明的。

于 2013-01-03T12:56:04.203 回答