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

Android-v4 PagerTabStrip导致IllegalStateException-必须以精确宽度测量,android,android-viewpager,Android,Android Viewpager,一个新的观察结果——我尝试了与独立活动和AppWidget配置视图相同的ViewPager——它经常作为配置视图崩溃,同时始终作为一个简单的活动运行良好 另一个观察结果-如果配置布局是ViewPager作为根,则不会发生崩溃。如果ViewPager嵌入FlowLayout或RelativeLayout中,则它经常崩溃 我在AppWidget配置xml中使用带有PagerTabStrip的v4 ViewPager,它在大多数情况下都能正常工作 但是,当加载视图时涉及某些处理时,我会出现此错误(应

  • 一个新的观察结果——我尝试了与独立活动和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()的代码片段-

    如何控制宽度模式

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

    在我的代码中,我试图排除许多因素,最终我可能成功地找出了一个根本原因:

    当我添加一个模拟的“工作”时,每个片段(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;
        }
    }
    
    公共静态类TestFragment扩展了片段{
    @凌驾
    创建视图上的公共视图(更平坦的充气机,
    视图组容器,捆绑包savedInstanceState){
    视图v=充气机。充气(右布局。飞溅,容器,假);
    试一试{
    Thread.sleep(5);//终于解决了!(为此浪费了2天):
    这是一句话:

      android:background="@drawable/dialog_full_holo_dark"
    
    我将其替换为:

      android:background="@color/black"
    
    问题就解决了。
    错误中没有任何东西表明这一点,而且它不是确定性的。通过消除-添加代码>测试>再次

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

    希望我节省了两天的时间让开发人员在这里碰车

    [更新]


    在另一个项目中,我通过使用
    框架布局
    包装
    查看页面
    解决了这个问题。我将所需的背景设置为
    框架布局
    ,并将
    @color/transparent
    设置为
    查看页面
    这非常简单且有效:

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

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

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

    当我添加
    android.support.v4.view.PagerTitleStrip
    actionbarsherlock
    时,这个错误发生在我身上。我通过添加
    android:layout\u gravity=“top”解决了这个问题
    进入该标签。

    谢谢,我在9个月前就解决了这个问题,但它可能会帮助其他人。你能解释一下为什么这段代码能解决这个问题吗?谢谢,我目前无法测试它来验证,但我将来会这样做。我在另一个项目中也遇到了同样的问题,并且在谷歌搜索中找到了我自己的帖子。所以我有机会验证——很遗憾它在我的情况下不起作用。到
    android.support.v4.view.PagerTabStrip
    标记?(在我的情况下没有解决)
    public class PagerTabStripBugfix extends PagerTabStrip {
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(
                    MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), 
                    heightMeasureSpec);
        }    
    
    
    }
    
    xmlns:tools="http://schemas.android.com/tools"