Параметр RelativeLayout устанавливает программным способом - бросает ClassCastException

Я раздуваю RelativeLayout из XML, а затем пытаюсь программно установить его параметры макета и получаю исключение 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, потому что я вижу что-то странное, где макет "перескакивает" на обертку/обертку. Я устанавливаю его в fill_parent/fill_parent в XML и прокручивает представление "сжимается" до того, что кажется wrap/wrap. Это действительно странно. Глядя на четырехклассный исходный код Android, я нашел комментарий, где разработчик говорит то же самое:

"Тем не менее, что-то странное происходит с параметрами макета. Если мы не будем явно указывать, что макет будет заполняться/заполняться после раздувания, макет переместится в макет обертки/обертки". (FriendsActivity.java:258)

Звучит так же, как и моя проблема, поэтому я пытаюсь сделать то же самое (установить макет с помощью кода), но в его случае он использует LinearLayout, тогда как я использую RelativeLayout.

Что мне не хватает? Спасибо заранее.

Ответы

Ответ 1

Параметры макета должны быть типа родителя. Поэтому, если вы создаете RelativeLayout и добавляете его в ListView, параметры макета должны быть типа ListView.LayoutParams, а не RelativeLayout.LayoutParams. Правильный способ сделать это - надуть так:

надуть (R.layout.mylayout, theListView, false);

Эта версия inflate() будет правильно раздувать параметры макета (android: layout_ *), определенные в XML.