1

< 編集 >

  1. 新しい観察 - スタンドアロン アクティビティと AppWidget 構成ビューと同じ ViewPager を試してみましたが、構成ビューとして頻繁にクラッシュしますが、単純なアクティビティとしては一貫して適切に実行されます。

  2. 別の観察 - 構成レイアウトがルートとして 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>
4

4 に答える 4

0

私もこの問題を抱えていたので、次の行を追加するだけで解決しました。

xmlns:tools="http://schemas.android.com/tools"
于 2014-02-07T21:19:02.183 に答える
0

android.support.v4.view.PagerTitleStripこのエラーは、 と を追加し たときに発生しましたactionbarsherlockandroid:layout_gravity="top"そのタグに追加することでこれを解決しました。

于 2014-06-21T23:29:35.090 に答える
0

これは非常にシンプルで機能します。

public class PagerTabStripBugfix extends PagerTabStrip {

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(
                MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), 
                heightMeasureSpec);
    }    


}
于 2013-10-11T07:20:00.160 に答える
0

ついに解決!(これで2日無駄になりました):それは次の行でした:

  android:background="@drawable/dialog_full_holo_dark"

私はそれを次のように置き換えました:

  android:background="@color/black"

そして問題はなくなりました。
エラーには何も示唆されておらず、決定論的ではありませんでした。削除によって難しい方法で解決しました-コードを追加>テスト>もう一度...

Android コードのバグである可能性が最も高く、おそらくビュー レイアウト管理の競合状態です。

仲間の開発者がここにぶつかるために 2 日間節約できたことを願っています。

[アップデート]

別のプロジェクトでは、 を でラップすることでこのバグを回避ViewPagerしましたFrameLayout。必要な背景を に設定しFrameLayout、 に設定@color/transparentしましたViewPager

于 2013-01-23T13:38:04.783 に答える