如何在 TabLayout 中获取 Tab 的视图?

How do I get the view of a Tab in a TabLayout?

我想在 TabLayout 中找到 Tab 的视图,以便我可以将它传递给另一个函数。我不确定如何去寻找风景。 myTabLayout.getTabAt(0).getCustomView() returns 空。

如何获取视图?

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

它 returns null 因为您一开始就没有使用任何自定义视图。它 return 只有在您使用它时才是自定义视图。要使用自定义视图,您的代码应该是这样的。

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

如果您使用以上行然后尝试调用 myTabLayout.getTabAt(0).getCustomView(),它会 return 您设置的视图。

我最终使用以下方法获取选项卡视图。我只是不确定它是否是最佳实践,或者它在所有 Android 版本中是否可靠:

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

查看源代码我们可以看到 tabLayout.getChildAt(0) returns SlidingTabStrip 是一个内部 class 扩展 LinearLayout 来保存选项卡视图。然后,您可以使用 .getChildAt(desiredPosition) 访问选项卡视图。请注意,使用 getChildAt() 时不会检查边界,因此请确保调用正确的索引并检查 null returns。

    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;

或者您可以自行决定复制源代码并更改方法和字段。

回答以备将来参考。

tabLayout.getTabAt(tabIndex).view

例子- 获取 tabLayout 中第一个选项卡的视图。使用 tabLayout.getTabAt(0).view