Android PagerTaskTrip在ViewPager中的位置
我有以下代码:Android PagerTaskTrip在ViewPager中的位置,android,android-layout,android-viewpager,Android,Android Layout,Android Viewpager,我有以下代码: <android.support.v4.view.ViewPager android:id="@+id/main_pager" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.PagerTabStrip android:id="@+id/pager_tab_st
<android.support.v4.view.ViewPager
android:id="@+id/main_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_tab_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</android.support.v4.view.ViewPager>
一切都被安排得井井有条
我现在想要的是页面选项卡覆盖ViewPager
它应该在顶部渲染,而不占用任何布局空间。
基本上,ViewPager中的片段应该从0,0开始,就像PagerTaskStrip一样
谢谢你的帮助。谢谢
我终于找到了一种方法
<RelativeLayout android:id="@+id/view_pager_container
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<android.support.v4.view.ViewPager
android:id="@+id/main_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_tab_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</android.support.v4.view.ViewPager>
</RelativeLayout>
在PagerTitle的onAttachedToWindow
中,检查父级是否为ViewPager:
final ViewParent parent = getParent();
if (!(parent instanceof ViewPager)) {
throw new IllegalStateException("PagerTitleStrip must be a direct child of a ViewPager.");
}
因此,这需要取消
解决方案:
我现在通过创建自己的自定义PagerTitleStrip/PagerTabStrip解决了这个问题。
我删除了上述行为,并将其替换为指向ViewPager的PagerTitleStrip的可样式化属性。这在values/attrs.xml中定义如下:
<declare-styleable name="PagerTitleStripCustom">
<attr name="parentViewPager" format="reference" />
</declare-styleable>
TypedArray types = context.obtainStyledAttributes(attrs,R.styleable.PagerTitleStripCustom, 0, 0);
pagerID = types.getResourceId(R.styleable.PagerTitleStripCustom_parentViewPager, 0);
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
final ViewParent parent = getParent();
ViewPager pager = null;
if (pagerID != 0) {
View test2 = ((View) parent).findViewById(pagerID);
pager = (ViewPager) test2;
} else if (pagerID == 0 && (parent instanceof ViewPager)) {
pager = (ViewPager) parent;
} else if (pagerID == 0 && !(parent instanceof ViewPager)) {
throw new IllegalStateException("PagerTitleStrip is neither a direct child of a ViewPager nor did you assign the ID of the ViewPager.");
} else {
throw new IllegalStateException("PagerTitleStrip: Something went completely wrong.");
}
final PagerAdapter adapter = pager.getAdapter();
pager.setInternalPageChangeListener(mPageListener);
pager.setOnAdapterChangeListener(mPageListener);
mPager = pager;
updateAdapter(mWatchingAdapter != null ? mWatchingAdapter.get() : null, adapter);
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.YOUR.PATH"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/main_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.v4.view.PagerTabStripCustom
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom:parentViewPager="@id/main_pager" />
</RelativeLayout>
在onAttachedToWindow
中,我们现在可以检查mViewPager变量是否为null,并将其分配给我们的页面,如下所示:
<declare-styleable name="PagerTitleStripCustom">
<attr name="parentViewPager" format="reference" />
</declare-styleable>
TypedArray types = context.obtainStyledAttributes(attrs,R.styleable.PagerTitleStripCustom, 0, 0);
pagerID = types.getResourceId(R.styleable.PagerTitleStripCustom_parentViewPager, 0);
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
final ViewParent parent = getParent();
ViewPager pager = null;
if (pagerID != 0) {
View test2 = ((View) parent).findViewById(pagerID);
pager = (ViewPager) test2;
} else if (pagerID == 0 && (parent instanceof ViewPager)) {
pager = (ViewPager) parent;
} else if (pagerID == 0 && !(parent instanceof ViewPager)) {
throw new IllegalStateException("PagerTitleStrip is neither a direct child of a ViewPager nor did you assign the ID of the ViewPager.");
} else {
throw new IllegalStateException("PagerTitleStrip: Something went completely wrong.");
}
final PagerAdapter adapter = pager.getAdapter();
pager.setInternalPageChangeListener(mPageListener);
pager.setOnAdapterChangeListener(mPageListener);
mPager = pager;
updateAdapter(mWatchingAdapter != null ? mWatchingAdapter.get() : null, adapter);
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.YOUR.PATH"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/main_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.v4.view.PagerTabStripCustom
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom:parentViewPager="@id/main_pager" />
</RelativeLayout>
现在,PagerTitleStrip/PagerTabStrip控件可以在布局中自由定位,如下所示:
<declare-styleable name="PagerTitleStripCustom">
<attr name="parentViewPager" format="reference" />
</declare-styleable>
TypedArray types = context.obtainStyledAttributes(attrs,R.styleable.PagerTitleStripCustom, 0, 0);
pagerID = types.getResourceId(R.styleable.PagerTitleStripCustom_parentViewPager, 0);
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
final ViewParent parent = getParent();
ViewPager pager = null;
if (pagerID != 0) {
View test2 = ((View) parent).findViewById(pagerID);
pager = (ViewPager) test2;
} else if (pagerID == 0 && (parent instanceof ViewPager)) {
pager = (ViewPager) parent;
} else if (pagerID == 0 && !(parent instanceof ViewPager)) {
throw new IllegalStateException("PagerTitleStrip is neither a direct child of a ViewPager nor did you assign the ID of the ViewPager.");
} else {
throw new IllegalStateException("PagerTitleStrip: Something went completely wrong.");
}
final PagerAdapter adapter = pager.getAdapter();
pager.setInternalPageChangeListener(mPageListener);
pager.setOnAdapterChangeListener(mPageListener);
mPager = pager;
updateAdapter(mWatchingAdapter != null ? mWatchingAdapter.get() : null, adapter);
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.YOUR.PATH"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/main_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.v4.view.PagerTabStripCustom
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom:parentViewPager="@id/main_pager" />
</RelativeLayout>
这只是一个快速而肮脏的概念证明。希望这对某人有所帮助。谢谢你的回复,但我已经试过了。我得到一个异常java.lang.IllegalStateException:PagerTitleStrip必须是ViewPager的直接子项。
还有其他提示吗?对不起。我以为你在试图指定ViewPager和PagerTitleStrip的布局(我说的是错的,PagerTitleStrip必须是ViewPager的子项)。我不知道你需要调整内容。如果你不介意我问,你为什么要调整ViewPager的内容?我想我想说的是,如果你的ViewPager的内容实际上是从0开始的,那么它们会被PagerTitleStrip部分隐藏。难道你不能去掉一些边距或填充来达到同样的效果吗?我的PagerTitleStrip大部分是透明的,标签是可见的。我希望内容在它下面流动。您将如何通过边距和填充物实现这一点?我想我需要重写ViewPager本身的布局逻辑,但是在代码中找不到正确的位置。好的,明白了。我不认为填充或边距可以解决这个问题。我做了一点调查,发现了。在我看来,你可以通过改变PagerAdapter实例化项目的方式来实现你的目标。谢谢你的回复。我查看了它,但不太明白如何在我的示例中使用它。在提供的示例中,我正在努力处理这一行:((ViewPager)pager.addView(view,position)代码>找不到addView方法。你能帮个忙吗?什么是寻呼机id和一个here pagerID=a.getResourceId(R.styleable.PagerTitleStripCustom\u parentViewPager,0);我可以猜到寻呼机id是int,但是“a”呢?它是类型化数组吗?请您展示一下attachedtowindow()的整个方法?@AnkitSrivastava:“a”是一个错误,当然应该是“types”。我还添加了onAttachedToWindow()中的所有代码。此方法的后一部分来自PagerTitleStrip的原始源代码。希望这有帮助。