2

ユーザーがアクションバーのナビゲーションタブをドラッグアンドドロップしてAndroid4.0ICSで並べ替えることができるようにする方法はありますか?非推奨のTabHostのタブを意味するのではなく、Honeycomb以降で使用されるActionBarに追加するタブを意味します。

ありがとう!

4

1 に答える 1

2

使用する限りActionBar.Tabs、彼らは単にこれを達成するための機能を持っていません。一方、を模倣する独自のカスタムクラスを作成するのTabsは簡単です。次に、を作成して追加するだけOnDragListenerで、タブバーを埋めるために使用できますOnTouchListenerView

たとえば、これは、を模倣するアプリの1つで使用するクラスですActionBar.Tabs

ScrollableTabView

    public class ScrollableTabView extends HorizontalScrollView implements OnPageChangeListener {

    private final Context mContext;

    private final LinearLayout mContainer;

    private final ArrayList<View> mTabs = new ArrayList<View>();

    private final int mDividerColor = 0xFF636363;

    private int mDividerMarginTop = 12;

    private int mDividerMarginBottom = 12;

    private int mDividerWidth = 1;

    private ViewPager mPager;

    private TabAdapter mAdapter;

    private Drawable mDividerDrawable;

    public ScrollableTabView(Context context) {
        this(context, null);
    }

    public ScrollableTabView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ScrollableTabView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);

        mContext = context;

        final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT);

        mDividerMarginTop = (int)(getResources().getDisplayMetrics().density * mDividerMarginTop);
        mDividerMarginBottom = (int)(getResources().getDisplayMetrics().density * mDividerMarginBottom);
        mDividerWidth = (int)(getResources().getDisplayMetrics().density * mDividerWidth);

        setHorizontalScrollBarEnabled(false);
        setHorizontalFadingEdgeEnabled(false);

        mContainer = new LinearLayout(context);
        mContainer.setOrientation(LinearLayout.HORIZONTAL);
        mContainer.setLayoutParams(params);

        addView(mContainer);
    }

    /**
     * Set the tabs Adapter
     * 
     * @param adapter
     */
    public void setAdapter(TabAdapter adapter) {
        mAdapter = adapter;

        if (mPager != null && mAdapter != null) {
            initTabs();
        }
    }

    /**
     * Attach ViewPager
     * 
     * @param pager
     */
    public void setViewPager(ViewPager pager) {
        mPager = pager;
        mPager.setOnPageChangeListener(this);

        if (mPager != null && mAdapter != null) {
            initTabs();
        }
    }

    /**
     * Initiate the tabs
     */
    private void initTabs() {

        mContainer.removeAllViews();
        mTabs.clear();

        if (mAdapter == null) {
            return;
        }

        for (int i = 0; i < mPager.getAdapter().getCount(); i++) {

            final int index = i;

            final View tab = mAdapter.getView(i);
            mContainer.addView(tab);

            tab.setFocusable(true);

            mTabs.add(tab);

            if (i != mPager.getAdapter().getCount() - 1) {
                mContainer.addView(getSeparator());
            }

            tab.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mPager.getCurrentItem() == index) {
                        selectTab(index);
                    } else {
                        mPager.setCurrentItem(index, true);
                    }
                }
            });

        }

        selectTab(mPager.getCurrentItem());
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // Nothing to do
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // Nothing to do
    }

    @Override
    public void onPageSelected(int position) {
        selectTab(position);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);

        if (changed) {
            selectTab(mPager.getCurrentItem());
        }
    }

    /**
     * @return Separates the tabs
     */
    private View getSeparator() {
        final View v = new View(mContext);

        final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mDividerWidth,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT);
        params.setMargins(0, mDividerMarginTop, 0, mDividerMarginBottom);
        v.setLayoutParams(params);

        if (mDividerDrawable != null) {
            v.setBackground(mDividerDrawable);
        } else {
            v.setBackgroundColor(mDividerColor);
        }

        return v;
    }

    /**
     * @param position
     */
    private void selectTab(int position) {

        for (int i = 0, pos = 0; i < mContainer.getChildCount(); i += 2, pos++) {
            final View tab = mContainer.getChildAt(i);
            tab.setSelected(pos == position);
        }

        final View selectedTab = mContainer.getChildAt(position * 2);

        final int w = selectedTab.getMeasuredWidth();
        final int l = selectedTab.getLeft();

        final int x = l - this.getWidth() / 2 + w / 2;

        smoothScrollTo(x, this.getScrollY());
    }
}

TabAdapter

    public interface TabAdapter {
    public View getView(int position);
}

TabAdapterを添付します

    public class ScrollingTabsAdapter implements TabAdapter {

    private final FragmentActivity activity;

    private final LayoutInflater inflater;

    private Button mTabs;

    // Tab titles
    private static final String[] mTitles = {
            "RECENT", "ARTISTS", "ALBUMS", "SONGS", "PLAYLISTS", "GENRES"
    };

    /**
     * @param act
     */
    public ScrollingTabsAdapter(FragmentActivity act) {
        activity = act;
        inflater = activity.getLayoutInflater();
    }

    @Override
    public View getView(int position) {
        mTabs = (Button)inflater.inflate(R.layout.tabs, null);
        if (position < mTitles.length) {
            mTabs.setText(mTitles[position]);
        }
        return mTabs;
    }
}

リアルのデフォルトのドローアブルと属性を使用して、膨らませActionBar.Tabsたスタイルを設定できます。ButtonSDKまたはおそらくWeb上のどこかからそれらを取得できます。ViewPagerこれを使用するには、にオブジェクトをアタッチし、ScrollableTabViewにそれぞれを追加しFragmentsますFragmentPagerAdapterデフォルトのドローアブルと属性を追加した後のスタイルに興味がある場合は、次のようになります。

ドラッグアンドドロップに関する限り、AndroidのWebサイトにはいくつかの優れたドキュメントがあります。ドラッグアンドドロップ

Web上にはわかりやすいチュートリアルもいくつかあります。LarsVogelによるAndroidドラッグアンドドロップチュートリアル

または、いつでもGoogleを使用して詳細を検索できます

于 2012-07-14T13:29:18.513 に答える