Привет, я пытаюсь добавить макет программным путем с помощью надувного устройства (это простой 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);