사용자가 ActionBar의 탐색 탭을 Android 4.0 ICS에서 다시 정렬하도록 드래그 앤 드롭 할 수 있습니까? 나는 더 이상 사용되지 않는 TabHost에서 탭을 의미하지는 않습니다. 여러분이 Honeycomb 이상에서 사용되는 ActionBar에 추가하는 탭을 의미합니다.드래그 앤 드롭 작업 표시 줄 탭 (Android 4.0 ICS)?
감사합니다.
사용자가 ActionBar의 탐색 탭을 Android 4.0 ICS에서 다시 정렬하도록 드래그 앤 드롭 할 수 있습니까? 나는 더 이상 사용되지 않는 TabHost에서 탭을 의미하지는 않습니다. 여러분이 Honeycomb 이상에서 사용되는 ActionBar에 추가하는 탭을 의미합니다.드래그 앤 드롭 작업 표시 줄 탭 (Android 4.0 ICS)?
감사합니다.
ActionBar.Tabs
을 사용하는 한이 기능을 구현할 수있는 기능이 없습니다. 반면에 Tabs
을 모방 한 나만의 맞춤 클래스를 만들면 탭 막대를 채우는 데 사용하는 View
에 OnDragListener
및 OnTouchListener
을 추가하면됩니다.
예를 들어, 이것은 내가 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
의 기본 드로어 블 및 속성을 사용하여 Button
을 부풀 리도록 스타일을 지정할 수 있습니다. SDK 나 웹 어딘가에서 가져올 수 있습니다. 사용하려면 ViewPager
개체를 ScrollableTabView
에 첨부하고 Fragments
을 각각 FragmentPagerAdapter
에 추가합니다. This is what they look like, if you're curious about the style after adding the default drawables and attributes
Android를 드래그 앤 드롭하는 것만 큼 Android에는 웹 사이트에 멋진 문서가 있습니다. Drag and Drop
웹에서 쉽게 읽을 수있는 자습서가 있습니다. Android Drag and Drop Tutorial, via Lars Vogel