Android - v4 PagerTabStrip导致IllegalStateException - 必须以精确的宽度进行测量

时间:2013-01-23 01:12:19

标签: android android-viewpager

<编辑>

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

    < / LI>
  2. 另一个观察 - 如果配置布局是ViewPager为root,则不会发生崩溃。如果ViewPager嵌入在FlowLayout或RelativeLayout中 - 它经常崩溃。

  3. &LT; /编辑&gt;

    我在我的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 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 个答案:

答案 0 :(得分:0)

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

  android:background="@drawable/dialog_full_holo_dark"

我将其替换为:

  android:background="@color/black"

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

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

希望我为这些伙伴们在这里挽救了2天。

<强> [更新]

在另一个项目中,我通过用ViewPager包裹FrameLayout来解决这个问题。我将所需的背景设置为FrameLayout,并将@color/transparent设置为ViewPager

答案 1 :(得分:0)

这很简单,也很有效:

public class PagerTabStripBugfix extends PagerTabStrip {

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


}

答案 2 :(得分:0)

我也遇到了这个问题,我只需添加一行就解决了这个问题:

xmlns:tools="http://schemas.android.com/tools"

答案 3 :(得分:0)

当我添加android.support.v4.view.PagerTitleStripactionbarsherlock时,我发生了此错误。我通过将android:layout_gravity="top"添加到该代码中来解决此问题。