我想将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。
那么如何才能从另一个不是他父母的视角中找到视图呢?或许你有其他解决方案吗?
答案 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) {
}
});
}
}