2016-07-13 33 views
0

私は3つのタブ(Slidingtablayout)を持っています。左のタブにはフラグメントがあり、右のタブにはフラグメントがあります。アンドロイド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)を編集したフラグメント

せずにする必要があります

1つのフラグメントを削除しました。

これは、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つのタブ間を移動するために必要なフラグメントが必要です。だから私の解決策は、あなたが2番目のタブから3つの断片を使用して活動を開始する必要があるからです。はい3つのフラグメントは、その中間のフラグメントのonResume()方法でこのコードを使用します。これは、新しい活動にあなたを取る必要があります

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

第2に、第2タブのアクティビティを起動することは、アプリケーションのデザインが非常に悪いことです。このアプリケーションをPlayストアでリリースする予定がある場合は、このデザインに従わないことをおすすめします。代わりにNavigation Drawerを使用してください。

+0

ありがとうございました! :) –

+0

@xDerAhmedあなたが役に立った場合、あなたは答えを受け入れることができます:) – Basanth

3

は2フラグメントと一つの活性

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/

関連する問題