android - PagerTabStrip 在 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_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         />
</android.support.v4.view.ViewPager>

一切都按应有的方式布局。

我现在想要的是 PagerTabStrip 覆盖 ViewPager

它应该在不占用任何布局空间的情况下呈现在顶部。 基本上,ViewPager 中的 fragment 应该从 0,0 开始,就像 PagerTabStrip 所做的那样。

感谢任何帮助。谢谢!

最佳答案

我终于找到了一种方法来做到这一点。

在 PagerTitleStrip 的 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>

然后像这样读入 PagerTitleStrip 构造函数:

TypedArray types = context.obtainStyledAttributes(attrs,R.styleable.PagerTitleStripCustom, 0, 0);   
pagerID = types.getResourceId(R.styleable.PagerTitleStripCustom_parentViewPager, 0);

onAttachedToWindow 中,我们现在可以检查 mViewPager 变量是否为 null 并将其分配给我们的 pagerID,如下所示:

@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);
}

现在 PagerTitleStrip/PagerTabStrip 控件可以像这样在布局中自由定位:

<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>

这只是概念的快速而肮脏的证明。希望这对某人有帮助。

关于android - PagerTabStrip 在 ViewPager 中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14586690/

相关文章:

android - Kiosk 模式应用程序的退出按钮

android - 每次拉动时拉动刷新错误都会继续添加

android - 使用 viewpager 附加的当前查看 fragment 的访问实例

java - 没有onPageSelected的Android viewpager调用setcurrentitem

android - Android Studio 上的 GitHub

java - 我的应用程序有一个操作栏,但没有 menu.xml。如何修改我的操作栏?

android - 我可以知道制造商配对的蓝牙设备型号吗?

android - 如何同时使用 Actionbar Tabs 和 Actionbar Spinner?

仅在 Android 6.0 中出现 Android Visualizer 错误

android - SwipeRefreshLayout + ViewPager,仅限制水平滚动?