当在其中一个布局上使用带有选项卡导航的 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 个孩子,这样我就避免了:
- 使用绝对倾角高度;
- 为不同的屏幕密度创建多个布局文件;
- 以编程方式和运行时更改布局行为以解决布局问题。
那么问题是如何使用 ViewPager 防止这种不一致,以便我可以在我的应用程序中拥有一个静态 LinearLayout,底部静态栏,当我切换活动时不会改变?