2

我想将 2 个视图链接在一起。ViewPager 和表示这种 ViewPager 状态的视图,类似于选项卡,但它可以以不同的方式显示(与通常的选项卡相同,一个文本视图,但只是文本会改变),它只是实现了一些接口。编程上我可以做到这一点,比如

myViewPager.setIndicator(myIndicatorView);

但是,为此我必须在某些父视图中找到这两个视图并调用此方法。我想简化它,并且有能力在 xml 模式中简单地管理它。这里是 xml 的示例。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/someTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <com.example.views.TextTabs
        android:id="@+id/info_tabs"
        android:layout_width="match_parent"
        android:layout_height="@dimen/info_tabs_height"
        android:background="@drawable/header_gradient" />

    <com.example.views.InfoPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        custom:tabs="@id/info_tabs" />
</LinearLayout>

我创建了自定义属性并将其引用到视图 ID。所以我的构造函数是:

public ViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);

    //Getting view id from xml attribute
    TypedArray attr = context.obtainStyledAttributes(attrs, R.styleable.ViewPager);

    //This id equals R.id.info_tabs
    int id = attr.getResourceId(R.styleable.ViewPager_tabs, -1);
    if (id != -1) {
        //i want to find view from all activity
        View tabs = ((Activity) context).findViewById(id);
        if (tabs != null && tabs instanceof ViewPagerTabs) {
            // if tabs finded
            mTabs = (ViewPagerTabs) tabs;
            setIndicator(mTabs);
        }
    }
}

问题是我无法通过 id 查看。这个想法是指示器视图可以在不同的地方,它可以是寻呼机的兄弟,它可以在更高级别的寻呼机等等。这就是为什么我试图从 Activity 中找到它。但即使从父视图中我也找不到它,因为 getParent 返回 null。

那么我怎样才能从另一个不是他父母的观点中找到观点呢?或者,也许您还有其他解决方案?

4

1 回答 1

2

问题是视图没有附加,所以我在这个视图中添加了 onAttachChangeListener,当它被附加时,我再次搜索视图。

//This id equals R.id.info_tabs
int id = attr.getResourceId(R.styleable.ViewPager_tabs, -1);
if (id != -1) {
    //i want to find view from all activity
    View tabs = ((Activity) context).findViewById(id);
    if (tabs != null && tabs instanceof ViewPagerTabs) {
        // if tabs finded
        mTabs = (ViewPagerTabs) tabs;
        setIndicator(mTabs);
    } else {

        //If we didn't find view - add listener, and waiting while this view will attached
        addOnAttachStateChangeListener(new OnAttachStateChangeListener {
            @Override
            public void onViewAttachedToWindow(View v) {
                View tabs = ((Activity)getContext()).findViewById(mTabsViewId);
                //
                if (tabs != null && tabs instanceof ViewPagerTabs) {
                        setIndicator((ViewPagerTabs) tabs);
                }
                //Remove this listener it's not usefull anymore
                removeOnAttachStateChangeListener(this);
            }

            @Override
            public void onViewDetachedFromWindow(View v) {
            }
        });
    }
}
于 2013-10-01T14:20:02.230 回答