2012-05-25 2 views
2

사용자가 ActionBar의 탐색 탭을 Android 4.0 ICS에서 다시 정렬하도록 드래그 앤 드롭 할 수 있습니까? 나는 더 이상 사용되지 않는 TabHost에서 탭을 의미하지는 않습니다. 여러분이 Honeycomb 이상에서 사용되는 ActionBar에 추가하는 탭을 의미합니다.드래그 앤 드롭 작업 표시 줄 탭 (Android 4.0 ICS)?

감사합니다.

답변

2

ActionBar.Tabs을 사용하는 한이 기능을 구현할 수있는 기능이 없습니다. 반면에 Tabs을 모방 한 나만의 맞춤 클래스를 만들면 탭 막대를 채우는 데 사용하는 ViewOnDragListenerOnTouchListener을 추가하면됩니다.

예를 들어, 이것은 내가 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

Or you can always simply use Google to find more