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());
}

}

最後にフラグメントの 1 つ (両方のフラグメントは同じですが、各レイアウトのテキストは異なります)

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 に答える