<编辑>
一个新的观察 - 我尝试了相同的ViewPager作为独立的Activity和AppWidget配置视图 - 它经常作为配置视图崩溃,同时作为一个简单的活动一直运行良好。
< / LI>另一个观察 - 如果配置布局是ViewPager为root,则不会发生崩溃。如果ViewPager嵌入在FlowLayout或RelativeLayout中 - 它经常崩溃。
&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>
答案 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.PagerTitleStrip
和actionbarsherlock
时,我发生了此错误。我通过将android:layout_gravity="top"
添加到该代码中来解决此问题。