Intereting Posts
FragmentManager: moveToState: состояние фрагмента для GridFragment {…} не обновлено inline; Ожидаемое состояние 1 найдено 0 Невозможно воспроизвести записанный аудиофайл с Android в iOS 5+ Как сохранить и восстановить состояние веб-просмотра? Кинжал 2, Библиотечные модули и @ Синглтон Как я могу использовать опцию `–multi-dex`? Ошибка сборки Gradle – исключение NullPointerException, заданное при выполнении задачи градиента app: compileDebugJava Аппаратное ускорение аппаратного обеспечения Android HTML5 – Canvas Как добавить коллекцию коллекций apache в Android Studio (Gradle) Как исправить андроид-студии 2.3 Ошибка NDK? Переопределите onDraw, чтобы изменить способ создания рисунка (Android) Вернуть ArrayList и String asyncTask Узнайте все о Android Uri class – использование и назначение Как написать приложение для Android для чтения / записи sysfs? Android set margin / padding для содержимого (текст) вместо контейнера (EditText) Многопоточный доступ к массиву

Установка параметров для завышенного представления внутри RelativeLayout, но получение исключения classcast

Привет, я пытаюсь добавить макет программным путем с помощью надувного устройства (это простой TextView). Родитель раздутого представления – RelativeLayout, который находится в ScrollView. Моя проблема в том, что я пытаюсь разместить новое представление под его заголовком (который находится в RelativeLayout), используя params.addRule и view.setLayoutParams (), но я получаю исключение класса: 11-12 13:06:57.360: E/AndroidRuntime(10965): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams , хотя родительский элемент представления явно RelativeLayout. Есть предположения?

Я думаю, это связано с тем, что RelativeLayout вложен в scrollview, но я не понимаю, почему это будет сделано, поскольку прямой родительский элемент, который я добавляю, является RelativeLayout.

  _innerLayout = (RelativeLayout) findViewById(R.id.innerRelativeLayout); LayoutInflater inflater = (LayoutInflater)this.getLayoutInflater(); View view = inflater.inflate(R.layout.comments, _innerLayout); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, R.id.commentsHeader); view.setLayoutParams(params); 

Если вы используете ненулевой View в качестве корня с методом inflate() возвращаемый View будет фактически представлением View переданным в качестве корня в методе. Таким образом, в вашем случае view является _innerLayout RelativeLayout которого в качестве родителя есть ScrollView , который является расширением FrameLayout (что объясняет LayoutParams ).

Поэтому либо используйте текущий метод раздувания, но ищите представление в возвращаемом представлении:

 View view = inflater.inflate(R.layout.comments, _innerLayout); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, R.id.commentsHeader); (view.findViewByid(R.id.theIdOfTextView)).setLayoutParams(params); 

Или используйте другую версию inflate() (которая не прикрепляет его к раздутому виду и вручную добавляет его вместе с соответствующими LayoutParams ):

 View view = inflater.inflate(R.layout.comments, _innerLayout, false); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.BELOW, R.id.commentsHeader); view.setLayoutParams(params); _innerLayout.addView(view);