Я создал класс, который расширяет представление:
public class BoardView extends View {
И я указал ширину и высоту BoardView в файле main.xml приложения:
<mypackage.BoardView android:id="@+id/board" android:layout_width="270px" android:layout_height="270px" />
Я пытаюсь получить ширину и высоту из функции, вызываемой из конструктора BoardView. Вот что я делаю:
ViewGroup.LayoutParams p = this.getLayoutParams(); int h = p.height;
Но getLayoutParams всегда возвращает null. Любая идея, почему это не работает?
Я не уверен, что параметры макета (то есть экземпляр LayoutParams) будут доступны внутри конструктора View. Я думаю, он будет доступен только после того, как были сделаны «макеты». Читайте о том, как Android рисует виды здесь. Кроме того, этот поток пытается указать, когда именно вы ожидаете получить измеренные размеры представления.
Обратите внимание: если вы заинтересованы только в получении значений атрибутов, переданных через XML-макет, вы можете использовать экземпляр AttributeSet, переданный как аргумент вашему конструктору.
public MyView(Context context, AttributeSet attrs){ // attrs.getAttributeCount(); // attrs.getAttributeXXXvalue(); }
После добавления представления к своему родителю доступны параметры макета. Попробуйте переместить свой код из конструктора вида в onAttachedToWindow()
потому что getLayoutParams()
не вернет null
там.
@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); assert getLayoutParams() != null; }