Программно использовать MATCH_PARENT для RelativeLayout внутри FrameLayout
Я делю на подклассы HorizontalScrollView (который является FrameLayout) и добавляю RelativeLayout к нему программно.
FrameLayout правильно заполняет родительское представление, но RelativeLayout внутри не отображается.
MainActivity:: OnCreate ()
setContentView(R.layout.activity_main);
CustomHorizontalScrollView custom = new CustomHorizontalScrollView(this);
ViewGroup contentView = (ViewGroup) findViewById(R.id.content);
contentView.addView(custom,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 180));
CustomHorizontalScrollView:: Конструктор ()
this.setBackgroundColor(Color.MAGENTA);
relativeLayout = new RelativeLayout(context);
relativeLayout.setBackgroundColor(Color.BLACK);
this.addView(relativeLayout, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
Результат:
RelativeLayout должен быть черным и должен заполнять родительский элемент, но это не так.
Странно то, что если я указываю ширину и высоту в пикселях вместо использования MATCH_PARENT, появляется RelativeLayout.
this.addView(relativeLayout, new FrameLayout.LayoutParams(90, 90));
Означает ли это, что я не могу использовать MATCH_PARENT при программном добавлении RelativeLayout к FrameLayout? Или я что-то упустил? Или, может быть, HorizontalScrollView поддерживает только ребенка с фиксированной шириной и высотой?
Заранее спасибо,
1 ответ
Я не нахожу строгой информации в Android SDK API Reference, но на самом деле HorizontalScrollView представляет собой "Контейнер макетов для иерархии представлений, который может прокручиваться пользователем, что позволяет ему быть больше, чем физический дисплей".
Итак, зачем вам HorizontalScrollView, если его уникальный дочерний элемент должен иметь такую же ширину?
Скорее всего, вы можете попробовать следующее:
this.addView(relativeLayout, new FrameLayout.LayoutParams(90, FrameLayout.LayoutParams.MATCH_PARENT));
... и появится RelativeLayout.
Но, возможно, следующее имеет больше смысла:
this.addView(relativeLayout, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.MATCH_PARENT));
Тогда RelativeLayout будет достаточно большим, чтобы содержать его дочерние элементы, и вы сможете прокручивать его с помощью HorizontalScrollView.
HorizontalScrollView имеет свойство fillViewport, которое можно установить в значение true, если вы хотите, чтобы HorizontalScrollView "растягивал свое содержимое, чтобы заполнить область просмотра": я думаю, что это может быть полезно только тогда, когда содержимое меньше, чем HorizontalScrollView, но (повторюсь) если содержимое ВСЕГДА меньше, чем HorizontalScrollView, то HorizontalScrollView бесполезен.