2016-07-13 6 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; 
      } 
     } 
    } 
} 

} 

그리고 나도 뭔가를 시도했다. 내가 갖고 싶어하기 때문에 :

// 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; 
} 
:

  • 3 탭
  • 2 조각 중간에
  • 탭 내가 여기에이 방법 (MainActivity)를 편집 한 단편

없이해야한다

하나의 조각을 삭제했습니다.

나는 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 개 조각, 그래서 중동 조각의 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/