拖放操作栏选项卡(Android 4.0 ICS)?

拖放操作栏选项卡(Android 4.0 ICS)?,android,tabs,drag-and-drop,android-actionbar,Android,Tabs,Drag And Drop,Android Actionbar,是否允许用户拖放ActionBar中的导航选项卡,以便在Android 4.0 ICS上对其重新排序?我不是指不推荐使用的TabHost中的选项卡,我是指添加到操作栏中的、在Honeycom及更高版本中使用的选项卡 谢谢 就使用goes而言,他们根本没有实现这一点的功能。另一方面,创建您自己的自定义类来模仿选项卡非常简单,那么您所要做的就是为用于填充选项卡栏的视图创建并添加一个OnDragListener和OnTouchListener 例如,这是我在我的一个应用程序中使用的一个类,它模仿Act

是否允许用户拖放ActionBar中的导航选项卡,以便在Android 4.0 ICS上对其重新排序?我不是指不推荐使用的TabHost中的选项卡,我是指添加到操作栏中的、在Honeycom及更高版本中使用的选项卡

谢谢

就使用goes而言,他们根本没有实现这一点的功能。另一方面,创建您自己的自定义类来模仿
选项卡
非常简单,那么您所要做的就是为用于填充选项卡栏的
视图
创建并添加一个
OnDragListener
OnTouchListener

例如,这是我在我的一个应用程序中使用的一个类,它模仿
ActionBar.Tabs

可滚动选项卡视图

    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);
}
    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;
    }
}
公共类滚动AbsAdapter实现TabAdapter{
私人最终碎片活动;
私人充气机;
专用按钮MTAB;
//标签标题
私有静态最终字符串[]mTitles={
“最近”、“艺术家”、“专辑”、“歌曲”、“播放列表”、“流派”
};
/**
*@param法案
*/
公共滚动AbsAdapter(碎片活动法){
活动=行动;
充气器=活动。GetLayoutFlater();
}
@凌驾
公共视图getView(内部位置){
mTabs=(按钮)充气器。充气(R.layout.tabs,空);
if(位置
您可以使用real
ActionBar.Tabs的默认绘图和属性来设置充气按钮的样式。您可以从SDK或web上的某个地方获取它们。要使用它,请将
ViewPager
对象附加到
ScrollableTabView
并将
片段添加到
FragmentPagerAdapter

就拖放而言,Android在其网站上有一些不错的文档

网上还有一些简单易懂的教程