私は現在Androidプロジェクトに取り組んでおり、水平スワイプジェスチャを使用してタブの使用とタブの変更をテストするための小さなテストプロジェクトを作成しました。
コードは、1つの問題を除いて、ほとんど機能しています。コンテンツをスワイプしてタブを変更すると、2番目のタブのアクティビティが表示されますが、実際のタブは選択されていません。つまり、Android 4.2では、アプリが読み込まれると、メインのFragmentActivityが起動し、タブ1内にある最初のフラグメント(フラグメント1)が表示されます。タブ1の下には、タブが選択されていることを示す青い線が表示されます。
次に画面をスワイプすると、2番目のアクティビティが表示されますが、青い線はタブ1の下にとどまり、タブ2に移動しません。
ただし、スワイプする代わりに実際のタブを選択すると、青い線は期待どおりに2番目のタブに移動します。
私が見ていたチュートリアルから本当に単純なものを見逃したのではないかと思いますが、それが何であるかを一生見つけることができません。
以下は、FragmentActivityのコードです。これは、アプリが最初に起動したときに読み込まれるものです。
public class TabsViewPagerFragmentActivity extends FragmentActivity
implements OnTabChangeListener, OnPageChangeListener{
private TabHost mTabHost;
private ViewPager mViewPager;
private HashMap<String, TabInfo> mapTabInfo = new HashMap<String, TabInfo>();
private PagerAdapter mPagerAdapter;
private class TabInfo
{
private String tag;
private Class<?> clss;
private Bundle bundle;
private Fragment fragment;
public TabInfo(String tag, Class<?> clss, Bundle bundle) {
this.tag = tag;
this.clss = clss;
this.bundle = bundle;
}
}
class TabFactory implements TabContentFactory
{
private final Context mContext;
public TabFactory (Context context)
{
mContext = context;
}
public View createTabContent(String tag)
{
View view = new View(mContext);
view.setMinimumWidth(0);
view.setMinimumHeight(0);
return view;
}
}
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.initialiseTabHost(savedInstanceState);
if (savedInstanceState != null)
{
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
this.initialiseViewPager();
}
protected void onSaveInstancestate(Bundle outState)
{
outState.putString("tab", mTabHost.getCurrentTabTag());
super.onSaveInstanceState(outState);
}
private void initialiseViewPager()
{
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Tab1Fragment.class.getName()));
fragments.add(Fragment.instantiate(this, Tab2Fragment.class.getName()));
this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments);
this.mViewPager = (ViewPager)super.findViewById(R.id.viewpager);
this.mViewPager.setAdapter(this.mPagerAdapter);
this.mViewPager.setOnPageChangeListener(this);
}
private void initialiseTabHost(Bundle bundle)
{
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
TabInfo tabInfo = null;
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost,
this.mTabHost.newTabSpec("Tab 1").setIndicator("Tab 1"),
tabInfo = new TabInfo("Tab1", Tab1Fragment.class, bundle));
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost,
this.mTabHost.newTabSpec("Tab 2").setIndicator("Tab 2"),
tabInfo = new TabInfo("Tab2", Tab2Fragment.class, bundle));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
mTabHost.setOnTabChangedListener(this);
}
private static void AddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost,
TabHost.TabSpec tabSpec, TabInfo tabInfo)
{
tabSpec.setContent(activity.new TabFactory(activity));
tabHost.addTab(tabSpec);
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
this.mViewPager.setCurrentItem(position);
}
@Override
public void onTabChanged(String tag) {
int pos = this.mTabHost.getCurrentTab();
this.mViewPager.setCurrentItem(pos);
}
}
以下はPageAdapterのコードです
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PagerAdapter(FragmentManager fm, List<Fragment> fragments)
{
super(fm);
this.fragments = fragments;
}
public int getCount()
{
return this.fragments.size();
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
}
あなたが提供できるどんな助けにも感謝します。