拖放操作栏选项卡(Android 4.0 ICS)?
是否允许用户拖放ActionBar中的导航选项卡,以便在Android 4.0 ICS上对其重新排序?我不是指不推荐使用的TabHost中的选项卡,我是指添加到操作栏中的、在Honeycom及更高版本中使用的选项卡 谢谢 就使用goes而言,他们根本没有实现这一点的功能。另一方面,创建您自己的自定义类来模仿拖放操作栏选项卡(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
选项卡
非常简单,那么您所要做的就是为用于填充选项卡栏的视图
创建并添加一个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(位置
您可以使用realActionBar.Tabs的默认绘图和属性来设置充气按钮的样式。您可以从SDK或web上的某个地方获取它们。要使用它,请将ViewPager
对象附加到ScrollableTabView
并将片段添加到FragmentPagerAdapter
中
就拖放而言,Android在其网站上有一些不错的文档
网上还有一些简单易懂的教程