2012-05-25 3 views
2

Est-il possible de permettre aux utilisateurs de glisser-déposer les onglets de navigation dans ActionBar pour les réorganiser sur Android 4.0 ICS? Je ne veux pas dire des onglets dans un tabHost obsolète, je veux dire les onglets que vous ajoutez à l'ActionBar qui sont utilisés dans Honeycomb et au-dessus.Glisser-déposer des onglets de barre d'action (Android 4.0 ICS)?

Merci!

Répondre

2

En ce qui concerne l'utilisation de ActionBar.Tabs, ils n'ont tout simplement pas la fonctionnalité pour y parvenir. D'autre part, créer votre propre classe personnalisée qui imite le Tabs est assez facile, alors tout ce que vous avez à faire est de créer et d'ajouter un OnDragListener et OnTouchListener pour le View que vous utilisez pour remplir votre barre d'onglets.

Par exemple, c'est une classe que j'utilise dans une de mes applications qui imite 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); 
} 

Attachez votre 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; 
    } 
} 

Vous peut utiliser les drawables et les attributs par défaut du vrai ActionBar.Tabs pour styler le Button que vous gonflez. Vous pouvez les récupérer à partir du SDK ou probablement quelque part sur le web. Pour l'utiliser, attachez un objet ViewPager au ScrollableTabView et ajoutez chacun de vos Fragments dans un FragmentPagerAdapter. En ce qui concerne le glisser-déposer, Android a de bons documents sur son site Web. Drag and Drop

Il existe également des didacticiels faciles à suivre sur le Web. Android Drag and Drop Tutorial, via Lars Vogel

Or you can always simply use Google to find more

Questions connexes