Параметр 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.
Ответ 2
Если ваше представление находится в ListView, вы должны использовать AbsListView.LayoutParams
.
См. также: Невозможно установить маржу элемента в ListView с помощью пользовательского адаптера