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的原始源代码。希望这有帮助。