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

15

我正在从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 中设置它,那是因为我看到了一些奇怪的东西,布局会“跳”到wrap / wrap。我已经在XML中将其设置为fill_parent/fill_parent,在滚动视图时视图“缩小”到看起来像wrap/wrap。它真的很奇怪。查看foursquared android源代码后,我发现开发人员在一个评论中说了同样的事情:

“虽然布局参数存在一些奇怪的问题。如果我们不在填充后明确将布局设置为填充/填充,则布局会跳到wrap / wrap布局。”(FriendsActivity.java:258)

这听起来就像我的问题,因此我也想尝试这样做(通过代码设置布局),但他使用的是LinearLayout,而我使用的是RelativeLayout。

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

2个回答

70

布局参数必须是父控件类型。因此,如果你创建了一个RelativeLayout并将其添加到ListView中,则布局参数必须为ListView.LayoutParams类型,而不是RelativeLayout.LayoutParams类型。正确的方法是以这种方式调用inflate:

inflate(R.layout.mylayout,theListView,false);

这个版本的inflate()函数将正确地填充在XML中定义的布局参数(android:layout_*)。


谢谢Romain,这确实回答了我的问题并允许我以编程方式设置RelativeLayout参数。不幸的是,我希望它能解决我的问题,即防止视图在滚动时“跳动”到wrap/wrap(它在滚动时明显缩小,然后在释放时恢复正常)。但它没有解决这个问题。非常奇怪。 - Cody Caughlan
如果没有更多关于代码的信息,我无法帮助你解决第二个问题。这确实非常奇怪 :) - Romain Guy

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接