Установить параметры макета RelativeLayout программно - создает исключение ClassCastException - PullRequest
15 голосов
/ 08 января 2011

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

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

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

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

Ответы [ 2 ]

70 голосов
/ 08 января 2011

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

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

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

1 голос
/ 28 марта 2013

Если ваше представление находится в ListView, вы должны использовать AbsListView.LayoutParams.

См. Также: Невозможно установить поле элемента в ListView с помощью пользовательского адаптера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...