2016-07-13 14 views
0

Ich habe 3 Tabs (ShiftTablayout). Die linke Registerkarte enthält ein Fragment und die rechte Registerkarte enthält ein Fragment.Android SlidingTab Startaktivität?

Aber die Registerkarte in der Mitte sollte eine neue Aktivität starten und kein Fragment haben. Ist das möglich und wie kann ich das machen?

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(); 
} 


} 

Wie die Fragmente wie folgt aussehen:

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

} 

und ich versuchte, zu etwas. Weil ich haben will:

  • 3 Tabs
  • 2 Fragmente
  • Tab in der Mitte sollte

I bearbeitet diese Methode hier (MainActivity) ohne Fragment sein:

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

Ich löschte ein Fragment.

Was bedeutet, ich habe das Ziel erreicht, 2 Fragmente zu haben.

  • 2 Fragmente Check

Weil ich das würde nur so viel Tabs als Fragmente haben, bedeutet, dass ich nur zu 2 Tabs haben würde.

So ging ich zum SlidingTabLayout und verändert diese Methode:

I die for-Schleife dazu geändert | i < 3 | anstelle von | i < Adapter.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); 
     } 
    } 
} 

Und Jetzt:

  • 3 Tabs Check

und

  • 2 SlidingTablayout Check

aber nicht

  • Tab in der Mitte, ohne Fragment

Ich hatte drei Fragmente und 3 Tabs i gelöscht einem Fragment sein sollte, und dies verursacht, dass das letzte Fragment eine Position nach oben bewegt. Jetzt befindet sich das rechte Fragment in der Position des mittleren Fragments. Wenn ich jetzt auf den mittleren Reiter klicke, bekomme ich das Fragment, das sich auf der rechten Registerkarte befand.

In diesem Fall ist meine Frage, wie man das Fragment, das jetzt in der Position der mittleren Registerkarte verschoben wurde, zurück auf die rechte Registerkarte bringt.

Ich hoffe, Sie verstehen, was ich will. Entschuldigung für mein schlechtes Englisch :).

Antwort

4

Erstens brauchen Sie diese Fragmente zu Navigieren zwischen 3 Registerkarten. Also meine Lösung ist, da Sie eine Aktivität vom 2. Tab starten müssen, verwenden Sie 3 Fragment. Ja 3 Fragmente, verwenden Sie so diesen Code in das onResume() Methode des Mittel Fragment:

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

Diese Sie auf eine neue Tätigkeit nehmen.

Zweitens, Starten der Aktivität für die 2. Registerkarte ist ein sehr schlechtes Design Ihrer Anwendung. Ich empfehle, diesem Design nicht zu folgen, wenn Sie diese Anwendung im Play Store veröffentlichen möchten. Verwenden Sie stattdessen Navigation Drawer.

+0

Vielen Dank! :) –

+0

@xDerAhmed Sie können die Antwort akzeptieren, wenn es Ihnen geholfen hat :) – Basanth

3

Erstellen Sie zwei Fragment und eine Aktivität

Add-Aktivität auf die Registerkarte wie unter

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); 

den Link unten folgen Aktivität Registerkarten hinzufügen. http://www.technotalkative.com/android-tab-bar-example-1/