actionbarsherlock + タブ + フラグメントを機能させるために一生懸命努力しました。
私はこのセットを静的にしか機能させることができません。これを Android マーケット アプリ (スワイプ動作) のように作成したいと思います。
内部に複数のフラグメントを含むレイアウトをインフレートする必要があると、行き詰まります。
Support4demos では、例として FragmentsTabsPager を取得しました。
actionbarsherlock + タブ + フラグメントを機能させるために一生懸命努力しました。
私はこのセットを静的にしか機能させることができません。これを Android マーケット アプリ (スワイプ動作) のように作成したいと思います。
内部に複数のフラグメントを含むレイアウトをインフレートする必要があると、行き詰まります。
Support4demos では、例として FragmentsTabsPager を取得しました。
私は実際に、ABS ライブラリとサポート ライブラリ以上のものを使わずに、これを機能させることができました。これが私のコードです:
public class ActionBarTabs extends SherlockFragmentActivity {
CustomViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mViewPager = new CustomViewPager(this);
mViewPager.setId(R.id.pager);
setContentView(mViewPager);
ActionBar bar = getSupportActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(bar.newTab().setText("Home"),
ToolKitFragment.class, null);
mTabsAdapter.addTab(bar.newTab().setText("FujiSan"),
FujiFragment.class, null);
}
public static class TabsAdapter extends FragmentPagerAdapter implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext, info.clss.getName(),
info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
以下に基づいてタブのコンテンツを読み込みます。
mTabsAdapter.addTab(bar.newTab().setText("Home"),
YOURFRAGMENTHERE.class, null);
これにより、ABS、サポート ライブラリ、およびフラグメントを使用して、素敵な「スワイプ タブ」効果が得られます。ABS を使用すると、ネイティブ ライブラリを操作する場合とほとんど同じになります。私は実際に、このコードを Google のページング タブの例から直接コピーし、ABS 用にわずかに変更しました。
お役に立てれば!
必要なものを実装するには、適切なライブラリが必要です。
基本的に、ViewPager
ライブラリはあなたに欠けているものです。私の提案:
1.ActionbarSherlock
それはとても死んでいます-一緒に働くのは簡単なので、私はそれを説明しません。
2. ViewPagerExtensions
ここで見つけることができます。ZIPファイルをダウンロードし、そこから新しいプロジェクトを作成します。
このセットを静的として機能させることしかできません。これをAndroidマーケットアプリ(スワイプムーブメント)のように作成したいと思います。
com.astuetz.viewpager.extensions.SwipeyTabsView
このプロジェクトから実装します。わかりやすい例があります。それはまさにあなたが望むことをします。選択できるタブスタイルは他にもあります(ICSに付属する新しい[People]タブを含む)。さらに、アプリのIDに合わせてスタイルを設定するのは非常に簡単です。
3.3。FragmentPagerAdapter
最後に、サポートライブラリ(v4)のそのクラス。
頑張ってください、そしてあなたがもっと助けが必要かどうか私に自由に尋ねてください。
私が提案したものを使用している場合は、オーバーライドinstantiateItem
する必要はありません。FragmentPagerAdapter
あなただけがする必要があります
FragmentManager
、スーパー実装を呼び出します。getCount
ページャー内のフラグメントの数を返すようにオーバーライドし、getItem
、これは、作成のためにフラグメントを返すために使用するものです。これは私がここに持っているコードの例です(完全に機能する本番の例)。これは、ページャーを実装するアクティビティの内部クラスです。
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 2;
}
@Override
public Fragment getItem(int position) {
Fragment f;
switch(position) {
case 0:
f= new ItemSalesDataFragment();
break;
case 1:
f= new DepartmentChooserFragment();
break;
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
return f;
}
}
ご覧のとおり、このポケットベルは2つの「ページ」を処理し、左側には販売データが表示されます。正しいものを使用すると、ユーザーはどの部門を選択できます。それらはgetItem
メソッドで返されます。適切なフラグメント(既に持っているフラグメントを使用できます。変更は必要ありません)。
MyFragmentPagerAdapter
予想どおり、1)インスタンス化するオブジェクトを作成し、2)オブジェクトへのアダプタを、ViewPager
インスタンス化したばかりのクラスになるように設定することで、これらすべてを結合します。ご覧のとおり、このgetItem
メソッドは、必要なすべてのフラグメントをポケットベルに「提供」します。例:
mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
もちろん、タブボタン自体を作成し、これらすべてを結合して相互通信するなど、他にもやるべきことがあります。GitHubからダウンロードしたViewPagerExtensionsZIPファイルで提供されている例を確認することをお勧めします。これはあなたのコメントの質問に対する答えにすぎません。ご覧のとおり、このライブラリを使用するコードはそれほど多くありません。
多くの例ではIllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first
、以前に選択したタブに戻ると、通常、例外 ( ) がスローされます。
FragmentStatePageAdapter
Google の例をプレーンではなくa に適応させFragmentPageAdapter
たいと思います。これにより、フラグメントが置き換えられ、このエラーが解決されます。通常、これはスペースを節約するために削除できると判断したフラグメントを破棄します。destroyItem(ViewGroup, int, Object)
フラグメントを常に保持したい場合は、空のブロックでオーバーライドしてください。
次に例を示します。
public class ActionBarTabs extends SherlockFragmentActivity {
CustomViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;
ActionBar mActionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mViewPager = new CustomViewPager(this);
mViewPager.setId(R.id.pager);
setContentView(mViewPager);
mActionBar = getSupportActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mActionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
mTabsAdapter = new TabsAdapter(this, mViewPager);
mTabsAdapter.addTab(mActionBar.newTab().setText("Page 1"),
YOURFRAGMENT_A.class, null);
mTabsAdapter.addTab(mActionBar.newTab().setText("Page 2"),
YOURFRAGMENT_B.class, null);
mTabsAdapter.addTab(mActionBar.newTab().setText("Page 3"),
YOURFRAGMENT_C.class, null);
}
public static class TabsAdapter extends FragmentPagerAdapter
implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final Context mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
return Fragment.instantiate(mContext,
info.clss.getName(), info.args);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
}
ABS とうまく連携し、実装が比較的簡単です。