2015-10-20 13 views
6

TabLayoutでTabのビューを探して、別の関数に渡すことができます。私はどのようにビューを見つけることに行くのか分からない。 myTabLayout.getTabAt(0).getCustomView()はnullを返します。TabLayoutでタブのビューを取得するにはどうすればよいですか?

ビューを取得するにはどうすればよいですか?

TabLayout tabLayout = (TabLayout) rootView.findViewById(R.id.tab_layout_main); 
tabLayout.addTab(tabLayout.newTab().setText("Page1")); 
tabLayout.addTab(tabLayout.newTab().setText("Page2")); 

viewPager = (ViewPager) rootView.findViewById(R.id.pager_main); 
pagerAdapter = new MyPagerAdapter(getActivity(), getChildFragmentManager(), tabLayout.getTabCount()); 
viewPager.setAdapter(pagerAdapter); 

答えて

37

私はタブビューを得るために以下を使用しました。

ソースを見てみると
mainTab = ((ViewGroup) tabLayout.getChildAt(0)).getChildAt(desiredPosition); 

我々はtabLayout.getChildAt(0)タブのビューを保持しているLinearLayoutを拡張する内部クラスですSlidingTabStripを返すことがわかります。私はちょうどそれがベストプラクティスですか、それはすべてのAndroidのバージョン間で信頼できるかどうかはわかりません。その後、.getChildAt(desiredPosition)でタブビューにアクセスできます。 getChildAt()境界をチェックしていない場合は、正しいインデックスを呼び出していることを確認し、nullが返されることを確認してください。

+0

これは役立ちます。ありがとう – kushpf

+0

これは私のために働いたが、私は生産アプリでこれを使用する前に躊躇します。 Googleが 'Tab'レイアウト機能を変更すれば、頭痛の種になるかもしれません。それはほとんどプライベートなので、それはかなり可能性があります。 – fahmad6

+0

どのようにtextviewを取得するには? onCreateでスタイルを変更する必要がありますか? –

0

あなたが最初の場所で任意のカスタムビューを使用していないので、それはnullを返します。それはあなたがそれを使用するときだけカスタムビューを返します。カスタムビューを使用する場合、コードは次のようになります。あなたは上記の行を使用して、myTabLayout.getTabAt(0).getCustomView()を呼び出そう

tabLayout.addTab(tabLayout.newTab().setCustomView(R.layout.custom_view).setText("Page1")); 

は、それはあなたが設定ビューを返すと思います。

+1

私はそのように思っていましたが、私はカスタムビューを使いたくありません。私は使用されているデフォルトのビューを取得したいと思います。 – NSouth

0
TabLayout tabLayout = .... (findview or code creation) 
    /** get selected tab index */ 
    int selectedTabPosition = tabLayout.getSelectedTabPosition(); 
    /** get tab for selected index or if u want any other tab set desired index */ 
    TabLayout.Tab tabAt = tabLayout.getTabAt(selectedTabPosition); 
    /** get view - but first u need set custom view on tabl via Tab.setCustomView(View) */ 
    View tabView = tabAt.getCustomView(): 

ヒント:あなたが最初ViewPagerチェックしてTabLayoutを取り込む場合

  • ビューは:)をレイアウトされている場合。 ViewPagerの場合はonLayoutChangedListenerに設定されていない場合は、ポケットベルで設定してください!

Tabソースあなたが反射を使用する場合:D

/** 
* A tab in this layout. Instances can be created via {@link #newTab()}. 
*/ 
public static final class Tab { 
    /** 
    * An invalid position for a tab. 
    * 
    * @see #getPosition() 
    */ 
    public static final int INVALID_POSITION = -1; 
    private Object mTag; 
    private Drawable mIcon; 
    private CharSequence mText; 
    private CharSequence mContentDesc; 
    private int mPosition = INVALID_POSITION; 
    private View mCustomView; 
    private final TabLayout mParent; 

    Tab(TabLayout parent) { 
     mParent = parent; 
    } 

    /** 
    * @return This Tab's tag object. 
    */ 
    @Nullable 
    public Object getTag() { 
     return mTag; 
    } 

    /** 
    * Give this Tab an arbitrary object to hold for later use. 
    * 
    * @param tag Object to store 
    * @return The current instance for call chaining 
    */ 
    @NonNull 
    public Tab setTag(@Nullable Object tag) { 
     mTag = tag; 
     return this; 
    } 

    /** 
    * Returns the custom view used for this tab. 
    * 
    * @see #setCustomView(View) 
    * @see #setCustomView(int) 
    */ 
    @Nullable 
    public View getCustomView() { 
     return mCustomView; 
    } 

    /** 
    * Set a custom view to be used for this tab. 
    * <p> 
    * If the provided view contains a {@link TextView} with an ID of 
    * {@link android.R.id#text1} then that will be updated with the value given 
    * to {@link #setText(CharSequence)}. Similarly, if this layout contains an 
    * {@link ImageView} with ID {@link android.R.id#icon} then it will be updated with 
    * the value given to {@link #setIcon(Drawable)}. 
    * </p> 
    * 
    * @param view Custom view to be used as a tab. 
    * @return The current instance for call chaining 
    */ 
    @NonNull 
    public Tab setCustomView(@Nullable View view) { 
     mCustomView = view; 
     if (mPosition >= 0) { 
      mParent.updateTab(mPosition); 
     } 
     return this; 
    } 

    /** 
    * Set a custom view to be used for this tab. 
    * <p> 
    * If the inflated layout contains a {@link TextView} with an ID of 
    * {@link android.R.id#text1} then that will be updated with the value given 
    * to {@link #setText(CharSequence)}. Similarly, if this layout contains an 
    * {@link ImageView} with ID {@link android.R.id#icon} then it will be updated with 
    * the value given to {@link #setIcon(Drawable)}. 
    * </p> 
    * 
    * @param layoutResId A layout resource to inflate and use as a custom tab view 
    * @return The current instance for call chaining 
    */ 
    @NonNull 
    public Tab setCustomView(@LayoutRes int layoutResId) { 
     return setCustomView(
       LayoutInflater.from(mParent.getContext()).inflate(layoutResId, null)); 
    } 

    /** 
    * Return the icon associated with this tab. 
    * 
    * @return The tab's icon 
    */ 
    @Nullable 
    public Drawable getIcon() { 
     return mIcon; 
    } 

    /** 
    * Return the current position of this tab in the action bar. 
    * 
    * @return Current position, or {@link #INVALID_POSITION} if this tab is not currently in 
    * the action bar. 
    */ 
    public int getPosition() { 
     return mPosition; 
    } 

    void setPosition(int position) { 
     mPosition = position; 
    } 

    /** 
    * Return the text of this tab. 
    * 
    * @return The tab's text 
    */ 
    @Nullable 
    public CharSequence getText() { 
     return mText; 
    } 

    /** 
    * Set the icon displayed on this tab. 
    * 
    * @param icon The drawable to use as an icon 
    * @return The current instance for call chaining 
    */ 
    @NonNull 
    public Tab setIcon(@Nullable Drawable icon) { 
     mIcon = icon; 
     if (mPosition >= 0) { 
      mParent.updateTab(mPosition); 
     } 
     return this; 
    } 

    /** 
    * Set the icon displayed on this tab. 
    * 
    * @param resId A resource ID referring to the icon that should be displayed 
    * @return The current instance for call chaining 
    */ 
    @NonNull 
    public Tab setIcon(@DrawableRes int resId) { 
     return setIcon(TintManager.getDrawable(mParent.getContext(), resId)); 
    } 

    /** 
    * Set the text displayed on this tab. Text may be truncated if there is not room to display 
    * the entire string. 
    * 
    * @param text The text to display 
    * @return The current instance for call chaining 
    */ 
    @NonNull 
    public Tab setText(@Nullable CharSequence text) { 
     mText = text; 
     if (mPosition >= 0) { 
      mParent.updateTab(mPosition); 
     } 
     return this; 
    } 

    /** 
    * Set the text displayed on this tab. Text may be truncated if there is not room to display 
    * the entire string. 
    * 
    * @param resId A resource ID referring to the text that should be displayed 
    * @return The current instance for call chaining 
    */ 
    @NonNull 
    public Tab setText(@StringRes int resId) { 
     return setText(mParent.getResources().getText(resId)); 
    } 

    /** 
    * Select this tab. Only valid if the tab has been added to the action bar. 
    */ 
    public void select() { 
     mParent.selectTab(this); 
    } 

    /** 
    * Returns true if this tab is currently selected. 
    */ 
    public boolean isSelected() { 
     return mParent.getSelectedTabPosition() == mPosition; 
    } 

    /** 
    * Set a description of this tab's content for use in accessibility support. If no content 
    * description is provided the title will be used. 
    * 
    * @param resId A resource ID referring to the description text 
    * @return The current instance for call chaining 
    * @see #setContentDescription(CharSequence) 
    * @see #getContentDescription() 
    */ 
    @NonNull 
    public Tab setContentDescription(@StringRes int resId) { 
     return setContentDescription(mParent.getResources().getText(resId)); 
    } 

    /** 
    * Set a description of this tab's content for use in accessibility support. If no content 
    * description is provided the title will be used. 
    * 
    * @param contentDesc Description of this tab's content 
    * @return The current instance for call chaining 
    * @see #setContentDescription(int) 
    * @see #getContentDescription() 
    */ 
    @NonNull 
    public Tab setContentDescription(@Nullable CharSequence contentDesc) { 
     mContentDesc = contentDesc; 
     if (mPosition >= 0) { 
      mParent.updateTab(mPosition); 
     } 
     return this; 
    } 

    /** 
    * Gets a brief description of this tab's content for use in accessibility support. 
    * 
    * @return Description of this tab's content 
    * @see #setContentDescription(CharSequence) 
    * @see #setContentDescription(int) 
    */ 
    @Nullable 
    public CharSequence getContentDescription() { 
     return mContentDesc; 
    } 
} 

またはあなたが(リフレクション経由)に直接フックすることができます。

private final SlidingTabStrip mTabStrip; 

か、ソースコードと変更の方法をコピーすることができますあなたの自由裁量でフィールドとフィールド。

+0

残念ながら、それは私にタブに関連付けられたビューではなく、タブを取得します。 – NSouth

+0

@NSouth - タブレイアウト - ページャコンテンツの上にあるもの - ページャコンテンツがフラグメントです - ページャコンテンツまたはタブコンテンツが必要ですか?編集 – ceph3us

+0

を参照してくださいありがとう、これは非常に有益な答えです。はい、私はタブのビューを(ポケベルの断片の内容ではなく)したいです。これはベストプラクティスではないとは思いますが、私が働くことがわかった方法です。 'mainTab =((ViewGroup)tabLayout.getChildAt(0))。getChildAt(0);'。カスタムビューを設定しないので、 'getCustomView()'を使うことはできません。しかし、私が必要なら私は自分のクラスを拡張することができます。 – NSouth

関連する問題