以编程方式设置RelativeLayout布局参数 - 抛出ClassCastException

时间:2011-01-08 02:08:46

标签: android android-layout

我正在从XML中膨胀RelativeLayout,然后尝试以编程方式设置其布局参数并接收ClassCastException。

代码:

profileHeader = (RelativeLayout)mInflater.inflate(R.layout.user_profile_header, null);
profileHeader.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT));

引发

E/AndroidRuntime( 2963): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams
E/AndroidRuntime( 2963):  at android.widget.ListView.measureScrapChild(ListView.java:1119)
E/AndroidRuntime( 2963):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1202)
E/AndroidRuntime( 2963):  at android.widget.ListView.onMeasure(ListView.java:1111)
E/AndroidRuntime( 2963):  at android.view.View.measure(View.java:8222)
E/AndroidRuntime( 2963):  at android.view.ViewGroup.measureChildWithMargins(V

我在网上看到其他笔记尝试使用LinearLayout.LayoutParams,但似乎没有帮助。

如果你想知道我为什么要这样做而不只是在XML中设置它,因为我看到一些奇怪的地方布局“跳转”到一个包裹/换行。我在XML中将其设置为fill_parent / fill_parent,并将视图“缩小”滚动到看似包装/换行的内容。它真的很奇怪。看着foursquared的android源代码,我找到了一条评论,其中开发人员说同样的事情:

“有些奇怪的事情正在进行布局参数。如果我们没有明确地将布局设置为在充气后填充/填充,布局会跳转到换行/换行布局。” (FriendsActivity.java:258)

这听起来就像我的问题,因此我试图做同样的事情(通过代码设置布局),但在他的情况下,他使用的是LinearLayout,而我使用的是RelativeLayout。

我错过了什么?提前谢谢。

2 个答案:

答案 0 :(得分:70)

布局参数必须是父类型。因此,如果要创建RelativeLayout并将其添加到ListView,则布局参数必须是ListView.LayoutParams类型,而不是RelativeLayout.LayoutParams。正确的方法是以这种方式调用膨胀:

膨胀(R.layout.mylayout,theListView,false);

此版本的inflate()将正确地扩充XML中定义的布局参数(android:layout_ *)。

答案 1 :(得分:1)

如果您的视图位于ListView中,则必须使用AbsListView.LayoutParams

另请参阅:Unable to set margin of item in ListView using custom Adapter