1

グーグルが提供したドキュメントコードとシャーロックアクションバークラスに基づいたタブリスナーがあります。

ListFragmentクラスを使用するための2つのタブと、カスタムGridFragmentクラスを使用するための1つのタブが必要でした。

ただし、タブリスナーは一度に1つのタイプのみを除外します。標準のフラグメントを作成し、それにリストビューまたはグリッドビューを配置する必要がありますか?または、それぞれに個別のタブリスナーを作成する必要がありますか?または、タブリスナーが、フラグメントクラスから継承している限り、任意のタイプのフラグメント、標準、リスト、またはグリッドを除外する方法はありますか。

package com.NYXDigital.LookBunnyFind;

import android.app.Activity;
import android.support.v4.app.FragmentTransaction;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragment;



public class TabListener<T extends SherlockFragment> implements ActionBar.TabListener {
    private SherlockFragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    /** Constructor used each time a new tab is created.
      * @param activity  The host Activity, used to instantiate the fragment
      * @param tag  The identifier tag for the fragment
      * @param clz  The fragment's Class, used to instantiate the fragment
      */
    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialized
        if (mFragment == null) {
            // If not, instantiate and add it to the activity
            mFragment = (SherlockFragment)SherlockFragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            // If it exists, simply attach it in order to show it
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // User selected the already selected tab. Usually do nothing.
    }
}
4

1 に答える 1

0

最終的に、TabListenerが引数として受け入れるジェネリックフラグメントアイテムクラスを作成しました。このクラスはフラグメントクラスを除き、自動的に作成します。

以下のこのコードは、タイトルとともに追加する各フラグメントクラスを含むクラスです。タブリスナーに追加されるフラグメントごとに1つ必要になります。

package com.NYXDigital.LookBunnyFind.Widget;

import android.support.v4.app.Fragment;

public class FragmentViewPagerItem {
    private String title;
    private Class<? extends Fragment> fragmentClass;

    public FragmentViewPagerItem(String title, Class<? extends Fragment> fragmentClass){
        this.title = title;
        this.setFragmentClass(fragmentClass);
    }

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    public Class<? extends Fragment> getFragmentClass() {
        return fragmentClass;
    }

    public void setFragmentClass(Class<? extends Fragment> fragmentClass) {
        this.fragmentClass = fragmentClass;
    }

    public Fragment newInstanceOfFragmentClass() throws InstantiationException, IllegalAccessException{
        return this.fragmentClass.newInstance();
    }

}

これは、上記のFragmentViewPagerItemClassの配列を受け入れるように変更されたアダプターです。

import java.util.ArrayList;
import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import com.NYXDigital.LookBunnyFind.Widget.FragmentViewPagerItem;

public class FragmentViewPagerAdapter extends FragmentPagerAdapter {

    private List<FragmentViewPagerItem> mFragments = new ArrayList<FragmentViewPagerItem>();

    public FragmentViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(FragmentViewPagerItem fragment) {
        if (mFragments == null) {
            mFragments = new ArrayList<FragmentViewPagerItem>();
        }
        mFragments.add(fragment);
        notifyDataSetChanged();
    }

    public Fragment getItem(int position) {
        Fragment fragment = null;

        try {
            fragment = mFragments.get(position % mFragments.size())
                    .newInstanceOfFragmentClass();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return fragment;
    }

    public int getCount() {
        return mFragments.size();
    }

    public CharSequence getPageTitle(int position) {
        return mFragments.get(position % mFragments.size()).getTitle()
                .toUpperCase();
    }
}

したがって、これらのクラスを使用するには、フラグメントごとにFragmentViewPagerItemを作成し、フラグメントのクラスだけでなくタイトルも渡す必要があります。次に、通常どおり、addFragmentメソッドを使用してアダプターに追加します。次に、それをViewPagerのアダプタとして設定し、タイトルインジケータをバインドしてタイトルを表示します。

// Create adapter for pager and add fragments to be displayed
FragmentViewPagerAdapter adapter = new FragmentViewPagerAdapter(
        getSupportFragmentManager());

// Local
FragmentViewPagerItem localFragment = new FragmentViewPagerItem(
        "Local", BranchListFragment.class);
adapter.addFragment(localFragment);

// Find
FragmentViewPagerItem findFragment = new FragmentViewPagerItem("Find",
        FindFragment.class);
adapter.addFragment(findFragment);

// Events
FragmentViewPagerItem eventsFragment = new FragmentViewPagerItem(
        "Events", EventListFragment.class);
adapter.addFragment(eventsFragment);

// Set the pager with an adapter
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);

// Bind the title indicator to the adapter
TabPageIndicator mIndicator = (TabPageIndicator) findViewById(R.id.indicator);
mIndicator.setViewPager(pager);

私はこれをオープンソーシングすることを考えています、皆さんはどう思いますか?

于 2013-11-08T10:06:17.587 に答える