2015-10-20 17 views
6

Ich möchte die Ansicht eines Tabs in einem TabLayout finden, so dass ich es an eine andere Funktion übergeben kann. Ich bin mir nicht sicher, wie ich die Ansicht finden soll. myTabLayout.getTabAt(0).getCustomView() gibt null zurück.Wie bekomme ich die Ansicht eines Tabs in einem TabLayout?

Wie bekomme ich die Ansicht?

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

Antwort

37

Ich endete mit dem folgenden, um Tab-Ansichten zu erhalten. Ich bin nur nicht sicher, ob es am beste Praxis oder wenn es zuverlässig über alle Android-Versionen:

mainTab = ((ViewGroup) tabLayout.getChildAt(0)).getChildAt(desiredPosition); 

an der Quelle der Suche können wir sehen, dass tabLayout.getChildAt(0) kehrt die SlidingTabStrip, die eine interne Klasse ist LinearLayout erstreckt, die die Registerkarte Ansichten halten. Anschließend können Sie auf die Registerkartenansicht mit .getChildAt(desiredPosition) zugreifen. Beachten Sie, dass bei der Verwendung von getChildAt() Grenzen nicht überprüft werden. Stellen Sie daher sicher, dass Sie korrekte Indizes aufrufen, und überprüfen Sie, ob null zurückgegeben wird.

+0

Nun, das hilft. Danke – kushpf

+0

Während dies für mich funktionierte, würde ich zögern, dies in einer Produktions-App zu verwenden. Es könnte einige Probleme bereiten, wenn Google die Tab-Layout-Funktionalität ändert. Da es meistens privat ist, ist es ziemlich wahrscheinlich. – fahmad6

+0

Wie bekomme ich die Textansicht? Ich muss den Stil in onCreate ändern? –

0

Es gibt null, weil Sie keine benutzerdefinierte Ansicht in erster Linie verwendet wird. Die benutzerdefinierte Ansicht wird nur zurückgegeben, wenn Sie sie verwenden. Für die Verwendung der benutzerdefinierten Ansicht sollte Ihr Code in etwa so aussehen.

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

Wenn Sie die obige Zeile verwenden und dann versuchen, myTabLayout.getTabAt(0).getCustomView() zu nennen, würde es Sie die Ansicht zurück, die Sie festlegen.

+1

Ich dachte, dass das der Fall war, aber ich möchte keine benutzerdefinierte Ansicht verwenden. Ich möchte die Standardansicht verwenden. – 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(): 

Hinweis:

  • wenn Sie bevölkern TabLayout mit ViewPager Check zuerst, wenn Ansicht :) ist angelegt. Wenn nicht onLayoutChangedListener für ViewPager eingestellt ist, dann Setup mit Pager!

Tab Quelle, wenn Sie möchten, um Reflexionen verwenden: 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; 
    } 
} 

oder Sie können (durch Reflexion) direkt in Haken:

private final SlidingTabStrip mTabStrip; 

oder Sie können Quellcode und Änderungsmethoden kopieren und Felder in Ihrem Ermessen.

+0

Leider bringt mich das 'Tab', nicht die mit dem Tab verbundene Ansicht. – NSouth

+0

@NSouth - Tab-Layout - ist das, was über Pager-Inhalt ist - Pager-Inhalt ist Fragment - wollen Sie Pager-Inhalt oder Tab-Inhalt? siehe bearbeiten – ceph3us

+0

Danke, das ist eine sehr informative Antwort. Ja, ich möchte die Ansicht des Tabs (nicht den Inhalt des Pagerfragments). Dies ist die Methode, die ich gefunden habe, obwohl ich mir nicht sicher bin, dass es die beste Vorgehensweise ist. 'mainTab = ((ViewGroup) tabLayout.getChildAt (0)). getChildAt (0);'. Ich kann 'getCustomView()' nicht verwenden, da ich nie eine benutzerdefinierte Ansicht festgelegt habe. Jedoch könnte ich meine eigene Klasse erweitern, wenn es nötig ist. – NSouth

Verwandte Themen