从另一个视图获取视图,而不是父视图

时间:2013-09-26 09:37:30

标签: android android-viewpager

我想将2个视图链接在一起。 ViewPager和视图指示此ViewPager状态,类似于选项卡,但它可以以不同方式显示(与通常的选项卡相同,一个文本视图,但只是文本将更改),它只是实现了一些界面。 Programaticaly我可以这样做,像

myViewPager.setIndicator(myIndicatorView);

但是,为此,我必须在某些父视图中找到这2个视图并调用此方法。我想简化它,并且能够在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。

那么如何才能从另一个不是他父母的视角中找到视图呢?或许你有其他解决方案吗?

1 个答案:

答案 0 :(得分: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) {
            }
        });
    }
}