2016-07-13 126 views
0

我有3个选项卡(Slidingtablayout)。左边的选项卡有一个片段,右边的选项卡有一个片段。android SlidingTab开始活动?

但中间的标签应该开始一个新的活动,没有一个片段。 这是可能的,我该怎么做?

MainActivity

public class MainActivity extends ActionBarActivity { 

MyPageAdapter pagerAdapter; 
List<Fragment> fragments; 
ViewPager viewPager; 
SlidingTabLayout tabLayout; 

    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // initializing SlidiTabLayout 
    tabLayout = (SlidingTabLayout) findViewById(R.id.tabLayout); 

    // Customizing SlidingTabLayout 
    tabLayout.setCustomTabView(R.layout.custom_tab, 0); 
    tabLayout.setDistributeEvenly(true); 

    // initializing PagerAdapter 
    fragments = getFragments(); 
    pagerAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments, this); 

    // initializing ViewPager 
    viewPager = (ViewPager) findViewById(R.id.pager); 
    viewPager.setAdapter(pageAdapter); 


    tabLayout.setViewPager(viewPager); 

} 
    // adding fagments 
    public List<Fragment> getFragments() { 
    List<Fragment> addFragment = new ArrayList<Fragment>(); 

    addFragment.add(ExampleFragment.newInstance()); 
    // Activity instead of fragment 
    addFragment.add(Change this .newInstance()); 
    addFragment.add(ExampleFragment.newInstance()); 

    return addFragment; 
} 

enter image description here

MyPagerAdapter

public class MyPageAdapter extends FragmentStatePagerAdapter { 

private final List<Fragment> fragments; 
private CharSequence Titles[]; 
private Context context; 

int icons [] = {R.drawable.lefticon, R.drawable.middleicon, R.drawable.righticon}; 
Drawable drawable; 

public MyPageAdapter(FragmentManager fm, List<Fragment> fragments, Context context) { 
    super(fm); 
    this.fragments = fragments; 
    this.context = context; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    drawable = context.getResources().getDrawable(icons[position]); 
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
    SpannableString sb = new SpannableString(" "); 
    ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM); 
    sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    return sb; 
} 
// this.fragments.get(position) 
@Override 
public Fragment getItem(int position) { 
    return this.fragments.get(position); 
} 

@Override 
public int getCount() { 
    return this.fragments.size(); 
} 


} 

碎片怎么样子:

public class PlayFragment extends Fragment { 

public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE"; 

public static final ExampleFragment newInstance() 
{ 
    PlayFragment mf = new PlayFragment(); 
    Bundle bd = new Bundle(1); 
    mf.setArguments(bd); 
    return mf; 
} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.example_fragment, container, false); 
    return v; 
} 
} 

SlidingTabLayout

public class SlidingTabLayout extends HorizontalScrollView { 
/** 
* Allows complete control over the colors drawn in the tab layout. Set with 
* {@link #setCustomTabColorizer(TabColorizer)}. 
*/ 
public interface TabColorizer { 

    /** 
    * @return return the color of the indicator used when {@code position} is selected. 
    */ 
    int getIndicatorColor(int position); 

} 

private static final int TITLE_OFFSET_DIPS = 24; 
private static final int TAB_VIEW_PADDING_DIPS = 16; 
private static final int TAB_VIEW_TEXT_SIZE_SP = 12; 

private int mTitleOffset; 

private int mTabViewLayoutId; 
private int mTabViewTextViewId; 
private boolean mDistributeEvenly; 

private ViewPager mViewPager; 
private SparseArray<String> mContentDescriptions = new SparseArray<String>(); 
private ViewPager.OnPageChangeListener mViewPagerPageChangeListener; 

private final SlidingTabStrip mTabStrip; 

public SlidingTabLayout(Context context) { 
    this(context, null); 
} 

public SlidingTabLayout(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public SlidingTabLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 

    // Disable the Scroll Bar 
    setHorizontalScrollBarEnabled(false); 
    // Make sure that the Tab Strips fills this View 
    setFillViewport(true); 

    mTitleOffset = (int) (TITLE_OFFSET_DIPS * getResources().getDisplayMetrics().density); 

    mTabStrip = new SlidingTabStrip(context); 
    addView(mTabStrip, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
} 

/** 
* Set the custom {@link TabColorizer} to be used. 
* 
* If you only require simple custmisation then you can use 
* {@link #setSelectedIndicatorColors(int...)} to achieve 
* similar effects. 
*/ 
public void setCustomTabColorizer(TabColorizer tabColorizer) { 
    mTabStrip.setCustomTabColorizer(tabColorizer); 
} 

public void setDistributeEvenly(boolean distributeEvenly) { 
    mDistributeEvenly = distributeEvenly; 
} 

/** 
* Sets the colors to be used for indicating the selected tab. These colors are treated as a 
* circular array. Providing one color will mean that all tabs are indicated with the same color. 
*/ 
public void setSelectedIndicatorColors(int... colors) { 
    mTabStrip.setSelectedIndicatorColors(colors); 
} 

/** 
* Set the {@link ViewPager.OnPageChangeListener}. When using {@link SlidingTabLayout} you are 
* required to set any {@link ViewPager.OnPageChangeListener} through this method. This is so 
* that the layout can update it's scroll position correctly. 
* 
* @see ViewPager#setOnPageChangeListener(ViewPager.OnPageChangeListener) 
*/ 
public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { 
    mViewPagerPageChangeListener = listener; 
} 

/** 
* Set the custom layout to be inflated for the tab views. 
* 
* @param layoutResId Layout id to be inflated 
* @param textViewId id of the {@link TextView} in the inflated view 
*/ 
public void setCustomTabView(int layoutResId, int textViewId) { 
    mTabViewLayoutId = layoutResId; 
    mTabViewTextViewId = textViewId; 
} 

/** 
* Sets the associated view pager. Note that the assumption here is that the pager content 
* (number of tabs and tab titles) does not change after this call has been made. 
*/ 
public void setViewPager(ViewPager viewPager) { 
    mTabStrip.removeAllViews(); 

    mViewPager = viewPager; 
    if (viewPager != null) { 
     viewPager.setOnPageChangeListener(new InternalViewPagerListener()); 
     populateTabStrip(); 
    } 
} 

/** 
* Create a default view to be used for tabs. This is called if a custom tab view is not set via 
* {@link #setCustomTabView(int, int)}. 
*/ 
protected TextView createDefaultTabView(Context context) { 
    TextView textView = new TextView(context); 
    textView.setGravity(Gravity.CENTER); 
    textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP); 
    textView.setTypeface(Typeface.DEFAULT_BOLD); 
    textView.setLayoutParams(new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

    TypedValue outValue = new TypedValue(); 
    getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, 
      outValue, true); 
    textView.setBackgroundResource(outValue.resourceId); 
    textView.setAllCaps(true); 

    int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density); 
    textView.setPadding(padding, padding, padding, padding); 

    return textView; 
} 

private void populateTabStrip() { 
    final PagerAdapter adapter = mViewPager.getAdapter(); 
    final View.OnClickListener tabClickListener = new TabClickListener(); 
     // adapter.getCount(); 
    for (int i = 0; i < adapter.getCount(); i++) { 
     View tabView = null; 
     TextView tabTitleView = null; 

     if (mTabViewLayoutId != 0) { 
      // If there is a custom tab view layout id set, try and inflate it 
      tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip, 
        false); 
      tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId); 
     } 

     if (tabView == null) { 
      tabView = createDefaultTabView(getContext()); 
     } 

     if (tabTitleView == null && TextView.class.isInstance(tabView)) { 
      tabTitleView = (TextView) tabView; 
     } 

     if (mDistributeEvenly) { 
      LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams(); 
      lp.width = 0; 
      lp.weight = 1; 
     } 

     tabTitleView.setText(adapter.getPageTitle(i)); 
     tabView.setOnClickListener(tabClickListener); 
     String desc = mContentDescriptions.get(i, null); 
     if (desc != null) { 
      tabView.setContentDescription(desc); 
     } 

     mTabStrip.addView(tabView); 
     if (i == mViewPager.getCurrentItem()) { 
      tabView.setSelected(true); 
     } 
    } 
} 

public void setContentDescription(int i, String desc) { 
    mContentDescriptions.put(i, desc); 
} 

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 

    if (mViewPager != null) { 
     scrollToTab(mViewPager.getCurrentItem(), 0); 
    } 
} 

private void scrollToTab(int tabIndex, int positionOffset) { 
    final int tabStripChildCount = mTabStrip.getChildCount(); 
    if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) { 
     return; 
    } 

    View selectedChild = mTabStrip.getChildAt(tabIndex); 
    if (selectedChild != null) { 
     int targetScrollX = selectedChild.getLeft() + positionOffset; 

     if (tabIndex > 0 || positionOffset > 0) { 
      // If we're not at the first child and are mid-scroll, make sure we obey the offset 
      targetScrollX -= mTitleOffset; 
     } 

     scrollTo(targetScrollX, 0); 
    } 
} 

private class InternalViewPagerListener implements ViewPager.OnPageChangeListener { 
    private int mScrollState; 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     int tabStripChildCount = mTabStrip.getChildCount(); 
     if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { 
      return; 
     } 

     mTabStrip.onViewPagerPageChanged(position, positionOffset); 

     View selectedTitle = mTabStrip.getChildAt(position); 
     int extraOffset = (selectedTitle != null) 
       ? (int) (positionOffset * selectedTitle.getWidth()) 
       : 0; 
     scrollToTab(position, extraOffset); 

     if (mViewPagerPageChangeListener != null) { 
      mViewPagerPageChangeListener.onPageScrolled(position, positionOffset, 
        positionOffsetPixels); 
     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
     mScrollState = state; 

     if (mViewPagerPageChangeListener != null) { 
      mViewPagerPageChangeListener.onPageScrollStateChanged(state); 
     } 
    } 

    @Override 
    public void onPageSelected(int position) { 
     if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { 
      mTabStrip.onViewPagerPageChanged(position, 0f); 
      scrollToTab(position, 0); 
     } 
     for (int i = 0; i < mTabStrip.getChildCount(); i++) { 
      mTabStrip.getChildAt(i).setSelected(position == i); 
     } 
     if (mViewPagerPageChangeListener != null) { 
      mViewPagerPageChangeListener.onPageSelected(position); 
     } 
    } 

} 

private class TabClickListener implements View.OnClickListener { 
    @Override 
    public void onClick(View v) { 
     for (int i = 0; i < mTabStrip.getChildCount(); i++) { 
      if (v == mTabStrip.getChildAt(i)) { 
       mViewPager.setCurrentItem(i); 
       return; 
      } 
     } 
    } 
} 

} 

,我试图东西太多。因为我想有:

  • 3标签
  • 2片段在中间
  • 标签应该没有片段

我编辑这里该方法(MainActivity):

// adding fragments 
    public List<Fragment> getFragments() { 
    List<Fragment> addFragment = new ArrayList<Fragment>(); 

    addFragment.add(ExampleFragment.newInstance()); 
    delete middle fragment 
    //addFragment.add(ExampleFragment.newInstance()); 

    addFragment.add(ExampleFragment.newInstance()); 

    return addFragment; 
} 

我删除了一个片段。

这意味着我完成了2个碎片的目标。

  • 2片段检查

因为我只有尽可能多的选项卡的片段,这将意味着我只拥有2个标签了。

所以我去了SlidingTabLayout和改变了这种方法:

我改变了对循环这个|我< 3 |而不是| i <适配器。getCount将(); |

private void populateTabStrip() { 
    final PagerAdapter adapter = mViewPager.getAdapter(); 
    final View.OnClickListener tabClickListener = new TabClickListener(); 
     // 3 instead of adapter.getCount(); | For 3 tabs 
    for (int i = 0; i < 3; i++) { 
     View tabView = null; 
     TextView tabTitleView = null; 

     if (mTabViewLayoutId != 0) { 
      // If there is a custom tab view layout id set, try and inflate it 
      tabView = LayoutInflater.from(getContext()).inflate(mTabViewLayoutId, mTabStrip, 
        false); 
      tabTitleView = (TextView) tabView.findViewById(mTabViewTextViewId); 
     } 

     if (tabView == null) { 
      tabView = createDefaultTabView(getContext()); 
     } 

     if (tabTitleView == null && TextView.class.isInstance(tabView)) { 
      tabTitleView = (TextView) tabView; 
     } 

     if (mDistributeEvenly) { 
      LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tabView.getLayoutParams(); 
      lp.width = 0; 
      lp.weight = 1; 
     } 

     tabTitleView.setText(adapter.getPageTitle(i)); 
     tabView.setOnClickListener(tabClickListener); 
     String desc = mContentDescriptions.get(i, null); 
     if (desc != null) { 
      tabView.setContentDescription(desc); 
     } 

     mTabStrip.addView(tabView); 
     if (i == mViewPager.getCurrentItem()) { 
      tabView.setSelected(true); 
     } 
    } 
} 

与现在:

  • 3页签检查

  • 2 SlidingTablayout 检查

,但不是在中间

  • 标签应不片段

我有3个片段和3个标签我删除一个片段,这导致了最后一个片段移动一个位置了。现在右边的片段位于中间片段的位置。现在,当我点击中间选项卡时,我得到了正确选项卡上的片段。

在这种情况下,我的问题是如何获取现在移动到中间选项卡位置的片段回到正确的选项卡。

希望你明白我想要什么。对不起,我的英语不好 :)。

回答

4

首先,您需要这些片段在3个选项卡之间导航。所以我的解决方案是,因为你需要从第二个选项卡启动一个活动,使用3片段。是的3个片段,所以在中间分段的onResume()方法使用此代码:

Intent intent = new Intent(getActivity(), YOUR_ACTIVITY_NAME.class); 
startActivity(intent); 

这应该带你到一个新的活动。其次,启动第二个选项卡的活动是您的应用程序的一个非常糟糕的设计。如果您打算在Play商店中发布此应用程序,我建议不要遵循此设计。改为使用Navigation Drawer

+0

非常感谢! :) –

+0

@xDerAhmed如果它帮助你,你可以接受答案:) – Basanth

3

如下

TabHost tabHost = getTabHost(); 
    TabHost.TabSpec spec; 
    Intent intent; 



    intent = new Intent().setClass(this, SecondActivity.class); 
    spec = tabHost.newTabSpec("Second").setIndicator("Second") 
        .setContent(intent); 
    tabHost.addTab(spec); 

以下链接到活动添加到标签创建两个片段和一个活动

添加活动的标签。 http://www.technotalkative.com/android-tab-bar-example-1/