これはNon Swipeable で取り組むべきだと思いますViewPager
。ビュー ページャーとその下にあるFragment
s がスワイプ ジェスチャに応答する方法はありません。でのスワイプを無効にするためにオーバーライドするメソッドは次のViewPager
とおりです。
onTouchEvent()
- 戻りますfalse
。
onInterceptTouchEvent()
- 戻りますfalse
。
これを達成する方法の詳細については、この SO の質問を参照してください。
Fragment
次に、各ページャー ホルダー内で sを使用したいと考えています。したがって、次のレイアウトを構築しています。
親アクティビティ内でFragmentPagerAdapter
インスタンス化され、タブにタグが追加されます。
アクティビティの変更
@Override
protected void onCreate(final Bundle saveInstanceState) {
final FragmentPagerAdapter myTabAdapter = new MyFragmentPagerAdapter(
<Your ViewPager View>, <Your activity context, this>);
myTabAdapter.addTab(getActionBar().newTab(), "YOUR TAG", "Your Title");
// etc...
}
これにより、上の図のフレームが得られます。ViewPager
およびその下にあるタブを含むホスティング アクティビティ。次は、Fragment
(テーブルを含む) をそれぞれのタブに入れることです。これはFragmentPagerAdapter
実装によって処理されます。
フラグメント アダプター (内部クラスからアクティビティへ):
private class MyFragmentPagerAdapter extends FragmentPagerAdapter implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
/**
* Constructs a pager adapter to back a {@link ViewPager}.
*
* @param pager
* The {@link ViewPager} widget.
* @param activityContext
* The context the widget is being added under.
*/
public SpotMenuFragmentPagerAdapter(final ViewPager pager,
final Context activityContext) {
super(getFragmentManager());
pager.setAdapter(this);
this.context = activityContext;
}
/**
* Adds a tab to the hosting activity action bar.
*
* @param newTab
* The tab to add.
* @param tag
* The tab tag for id purposes.
* @param label
* The label of the tab displayed to the user.
*/
public void addTab(final ActionBar.Tab newTab, final String tag,
final String label) {
newTab.setTag(tag);
newTab.setText(label);
newTab.setTabListener(this);
getSupportActionBar().addTab(newTab);
}
/**
* This is where you do the work of building the correct fragment based
* on the tab currently selected.
*
* @see FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(final int position) {
final Tab tab = getActionBar().getTabAt(position);
if ("MY TAG".equals(tab.getTag().toString()) {
// instantiate the fragment (table) for "MY TAG"
} else {
// instantiate something else...
}
}
/**
* One fragment per tab.
*
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return getSupportActionBar().getTabCount();
}
/**
* @see ViewPager.OnPageChangeListener#onPageScrollStateChanged(int)
*/
@Override
public void onPageScrollStateChanged(final int arg0) {
// No-op.
}
/**
* @see ViewPager.OnPageChangeListener#onPageScrolled(int, float, int)
*/
@Override
public void onPageScrolled(final int arg0, final float arg1,
final int arg2) {
// No-op.
}
/**
* @see ViewPager.OnPageChangeListener#onPageSelected(int)
*/
@Override
public void onPageSelected(final int position) {
getSupportActionBar().setSelectedNavigationItem(position);
}
/**
* @see TabListener#onTabSelected(app.ActionBar.Tab,
* app.FragmentTransaction)
*/
@Override
public void onTabSelected(final Tab tab, final FragmentTransaction ft) {
viewPager.setCurrentItem(tab.getPosition());
}
/**
* @see TabListener#onTabUnselected(ActionBar.Tab,
* app.FragmentTransaction)
*/
@Override
public void onTabUnselected(final Tab tab, final FragmentTransaction ft) {
// No-op.
}
/**
* @see TabListener#onTabReselected(ActionBar.Tab,app.FragmentTransaction)
*/
@Override
public void onTabReselected(final Tab tab, final FragmentTransaction ft) {
// No-op.
}
}
したがって、この時点で、「スワイプ不可」のビュー ページャーをホストするアクティビティと、タイトルの下 (または画面サイズによっては横) のタブ バーの形式でタブを切り替えるメカニズムができていることを願っています。この時点から、タブ バーをいくつかのナビゲーション矢印に置き換えるようにカスタマイズできると確信しています。
注:その多くは記憶に基づいて書かれていますが、うまくいけば、これでどこに行くかの要点を伝えました.
アップデート
更新された質問への回答: タブを任意の古いビューに設定できます。それに応じてTabSpecを設定します。申し訳ありませんが、私はこれを自分で使用していません。