1

当在其中一个布局上使用带有选项卡导航的 ViewPager 时,我检测到 2 个布局之间存在布局一致性问题。对于 FragmentActivity(使用 viewpager)和正常活动,我有以下 2 个非常相似的 XML 布局:

片段活动布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="1" >

    <package.ui.tabs.CustomViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/pager"
        android:layout_width="match_parent"

        android:layout_height="0dp"
        android:layout_weight="0.84"
        tools:context=".MainActivity" >
    </package.ui.tabs.CustomViewPager>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.16"
        android:background="@drawable/gradient_menu_bottom"
        android:orientation="horizontal"
        android:weightSum="4" >

    <!-- ...other stuff... -->

    </LinearLayout>

</LinearLayout>

(正常)活动布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="1" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.84">

    <!-- ...other stuff... -->

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.16"
        android:background="@drawable/gradient_menu_bottom"
        android:orientation="horizontal"
        android:weightSum="4" >

    <!-- ...other stuff... -->

    </LinearLayout>

</LinearLayout>

请注意,CustomViewPager 是 SDK 通过创建新的 TabsActivity eclipse 项目提供的 ViewPager 实现。我将在下面添加代码,这样您就可以确保视图定位和测量不会以任何方式被覆盖:

CustomViewPager.java

public class CustomViewPager extends ViewPager {
    private boolean enabled;

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    public void setPagingEnabled(boolean enabled) {
        this.enabled = enabled;
    }
}

即使它们在基本布局格式上完全相等,因为它们具有相同的权重属性并使用相同类型的布局,这两个活动在 Eclipse 所见即所得和运行时在屏幕底部的一个像素上都不同- FragmentActivity 不会将最后一个 LinearLayout 与底部对齐,即使强制使用 0 边距属性也是如此,而正常活动的行为与预期一样。结果类似于下面链接中的图片(我对图片没有声誉):

布局错误

所以总而言之,使用 viewpager 会产生与屏幕底部意外的不良对齐。我最初使用根 RelativeLayout 来包含 viewpager,LinearLayout 和边距都可以,即使使用 viewpager 也可以与底部对齐。

问题是我需要它作为 LinearLayout 以便使用权重按比例缩放 2 个孩子,这样我就避免了:

  1. 使用绝对倾角高度;
  2. 为不同的屏幕密度创建多个布局文件;
  3. 以编程方式和运行时更改布局行为以解决布局问题。

那么问题是如何使用 ViewPager 防止这种不一致,以便我可以在我的应用程序中拥有一个静态 LinearLayout,底部静态栏,当我切换活动时不会改变?

4

0 回答 0