2 つのレイアウト間でレイアウトの一貫性の問題が検出されました。それらの 1 つでタブ ナビゲーションを使用して ViewPager を使用している場合です。FragmentActivity (viewpager を使用) と通常のアクティビティ用に、次の 2 つの非常によく似た XML レイアウトがあります。
FragmentActivity レイアウト
<?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;
}
}
ベース レイアウト フォーマットでは完全に同じですが、同じウェイト プロパティを持ち、同じタイプのレイアウトを使用しているため、これら 2 つのアクティビティは、Eclipse WYSIWYG 上でも実行時でも、画面下部の 1 ピクセルだけ異なります。通常のアクティビティは期待どおりに動作しますが、FragmentActivity は最後の LinearLayout を下に揃えることはありません。マージン プロパティが 0 で強制された場合でも同様です。結果は、以下のリンクの写真のようなものです (私は写真に定評がありません)。
全体として、viewpager を使用すると、画面の下部に予期しない不適切な位置合わせが発生します。私は最初にルート RelativeLayout を使用してビューページャーと LinearLayout を含め、マージンは問題なく、ビューページャーでも下に揃えました。
問題は、ウェイトを使用して 2 つの子を比例的にスケーリングするために、これを LinearLayout として必要とすることです。
- 絶対傾斜高の使用;
- 異なる画面密度用に複数のレイアウト ファイルを作成する。
- レイアウトの問題を解決するために、レイアウトの動作をプログラムおよび実行時に変更します。
問題は、ViewPager を使用してこの不一致を防止し、アクティビティを切り替えても変化しない静的 LinearLayout をアプリで使用できるようにする方法です。