< 編集 >
新しい観察 - スタンドアロン アクティビティと AppWidget 構成ビューと同じ ViewPager を試してみましたが、構成ビューとして頻繁にクラッシュしますが、単純なアクティビティとしては一貫して適切に実行されます。
別の観察 - 構成レイアウトがルートとして ViewPager である場合、クラッシュは発生しませんでした。ViewPager が FlowLayout または RelativeLayout に埋め込まれている場合 - 頻繁にクラッシュします。
</ 編集 >
AppWidget 構成 xml で PagerTabStrip を使用して v4 ViewPager を使用していますが、ほとんどの場合、完全に機能します。
ただし、ビューの読み込み中に何らかの処理が行われると、このエラー (アプリのクラッシュ) が発生します。
java.lang.IllegalStateException: Must measure with an exact width
at android.support.v4.view.PagerTitleStrip.onMeasure(PagerTitleStrip.java:428)
at android.view.View.measure(View.java:8335)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1350)
at android.view.View.measure(View.java:8335)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
...etc...
android.support.v4.view.PagerTitleStrip.onMeasure() のコード スニペット -
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
//...
if (widthMode != MeasureSpec.EXACTLY) {
throw new IllegalStateException("Must measure with an exact width");
}
//...
}
widthMode を制御するにはどうすればよいですか??
上記のすべてのスタックは、私のコードの外で発生しています。
私のコードでは、多くの要因を除外しようとしましたが、最終的には根本的な原因を特定できた可能性があります。
フラグメント (X30 フラグメント) ごとに 5 ミリのスリープのモック「作業」を追加すると、上記のエラーが発生し、それを削除すると、エラーはなくなったようです。作業を onCreate() に移動しようとしました-違いはありませんでした
public static class TestFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.splash, container, false);
try {
Thread.sleep(5); // << mock work causes quite consistent error
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i(TAG, "..onCreateView");
return v;
}
}
実際のアダプターのフラグメントに対して行っている実際の作業は最小限であり、回避することはできません (後でバックグラウンド スレッドにデータを入力する初期値を設定します)。そのため、バックグラウンド スレッドをどれだけ延期できるかわかりません。
誰もこれを経験していますか?上記のエラーが発生する理由と、それを回避できる場合はどうすればよいですか?
参考までに(関連性があるかどうかはわかりません):
<LinearLayout ...>
<android.support.v4.view.ViewPager
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:id="@+id/aw_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:background="@drawable/dialog_full_holo_dark"
android:fadingEdge="horizontal"
android:fadingEdgeLength="40dp" >
<android.support.v4.view.PagerTabStrip
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top" />
</android.support.v4.view.ViewPager>
</LinearLayout>