2011-01-08 2 views
14

Я раздуваю RelativeLayout из XML, а затем пытаюсь программно установить его параметры макета и получаю исключение ClassCastException.Set RelativeLayout layout params программно - throws 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.

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

ответ

69

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

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

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

+0

Благодаря Ромен, это действительно отвечает на этот вопрос и позволяет мне установить RelativeLayout PARAMS программно. К сожалению, я надеялся, что это решит мою проблему, препятствующую просмотру «перепрыгивания» на обертку/обертку прокрутки (она заметно сокращается на прокрутке, а затем возвращается к норме при выпуске). Но это не решило эту проблему. Очень странно. –

+0

Я не могу помочь вам по этой второй проблеме без дополнительной информации о коде. Это действительно очень странно :) –