1

< 编辑 >

  1. 一个新的观察 - 我已经尝试了与独立 Activity 和 AppWidget 配置视图相同的 ViewPager - 它经常作为配置视图崩溃,而作为一个简单的活动始终运行良好。

  2. 另一个观察 - 如果配置布局是 ViewPager 作为根,没有发生崩溃。如果 ViewPager 嵌入在 FlowLayout 或 RelativeLayout - 它经常崩溃。

</ 编辑 >

我在我的 AppWidget 配置 xml 中使用 v4 ViewPager 和 PagerTabStrip,它在大多数情况下都能正常工作。

但是,当加载视图时涉及一些处理时,我会收到此错误(应用程序崩溃):

 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");
    }
    //...
}

我怎么能控制宽度模式?

上面的所有堆栈都发生在我的代码之外。

在我的代码中,我试图排除许多因素,最终我可能设法找出根本原因:

当我为每个片段(X30 片段)添加 5 milis 睡眠的模拟“工作”时,我得到了上述错误,并且在删除它时 - 错误似乎消失了。尝试将工作移至 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

终于解决了!(为此浪费了 2 天):就是这条线:

  android:background="@drawable/dialog_full_holo_dark"

我将其替换为:

  android:background="@color/black"

问题就消失了。
错误中没有任何内容表明这一点,而且它不是确定性的。通过消除解决了困难的方法 - 添加代码>测试>再次...

这很可能是 Android 代码中的错误,可能是视图布局管理中的一些竞争条件。

希望我为在这里碰到的开发人员节省了 2 天的时间。

[更新]

在另一个项目中,我通过ViewPagerFrameLayout. 我将所需的背景设置为FrameLayout, 并设置@color/transparentViewPager.

于 2013-01-23T13:38:04.783 回答
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

我也遇到了这个问题,我通过简单地添加以下行来解决它:

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

当我添加android.support.v4.view.PagerTitleStrip和 时发生了这个错误actionbarsherlock。我通过添加android:layout_gravity="top"到该标签中解决了这个问题。

于 2014-06-21T23:29:35.090 回答