私はこれに数日間苦しんでいます。ボタンをクリックするとプログラムでタブを切り替えようとしています。タブを使用してアクティビティを変更しただけではプログラムは問題なく動作しますが、onClickメソッドをsetCurrentTabに接続するとエラーが発生します。これは機能しない方法です。これはかなり基本的で簡単な機能ですが、ボタンクリックをタブの切り替えに接続しようとする人々のドキュメントや例はあまり見かけません。ありがとう。
ImageButton next = (ImageButton) findViewById(R.id.ButtonAsk);
next.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
TabHost tabHost = (TabHost) findViewById(Android.R.id.tabhost);
tabHost.setCurrentTab(2);
}
});
エラーログの編集履歴を参照してください。
次に、onClick()内に配置できるコード例を示します。マークとケビンが説明したとおりです。
TabActivity tabs = (TabActivity) getParent();
tabs.getTabHost().setCurrentTab(2);
私はこのコードを何度も使用しています。これが明確になることを願っています。
現在のアクティビティに_@Android:id/tabhost
_のウィジェットはありません。したがって、findViewById()
はnullを返し、setCurrentTab()
の呼び出しは失敗します。
さて、私の推測では、タブにアクティビティを配置しているためです。タブにViews
を入れていれば、コードは機能します。また、コードが高速になり、占有するヒープ領域が少なくなり、スタック領域が不足するリスクが軽減されます。
現在の実装を使い続けたい場合は、getParent().findViewById()
だけでなくfindViewById()
を呼び出してみてください。
2017年の回答
ここでの他の回答は古くなっているようです。 タブ付きのスワイプビューの作成 のドキュメントでは、 TabLayout
と ViewPager
を併用することを推奨しています。
これを行うためのコードの一部の実装を次に示します。
public class MainActivity extends AppCompatActivity {
private ViewPager mViewPager;
private Button mButton;
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
mViewPager = (ViewPager) findViewById(R.id.fieldspager);
// ...
mButton.setOnClickListener(myButtonClickHandler);
}
View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
@Override
public void onClick(View view) {
mViewPager.setCurrentItem(2, true);
}
};
}
上記のコードから、タブをプログラムで設定することは次のように行われます:
mViewPager.setCurrentItem(2, true); // set it to the third tab
ここに別の実装があります ビューページャーとタブレイアウトの設定方法の詳細。
これは私のために働く
getActionBar().setSelectedNavigationItem(0);
pdate:質問のコードにコードを挿入して、コンテキストを増やします...
ImageButton next = (ImageButton) findViewById(R.id.ButtonAsk);
next.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
getActionBar().setSelectedNavigationItem(2);
}
});