Android Графика

Я пытаюсь написать свой собственный класс макета, который помещает его в регулярную сетку. Сама компоновка работает хорошо, но я не могу получить текст на кнопках внутри этого макета, чтобы быть центрированным. Когда я помещаю те же кнопки в LinearLayout, текст кнопки центрируется по желанию, поэтому ошибка, вероятно, в моем макете. Но как мой макет влияет на гравитацию текста на его дочерние представления? Я подозреваю, что это имеет какое-то отношение к параметрам макета, но я действительно не знаю, как это работает.

Вот некоторые фрагменты кода, которые могут иметь отношение к проблеме:

Мой класс макета WeightedGridLayout:

public class WeightedGridLayout extends ViewGroup { // ... @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { for (int i = 0, N = getChildCount(); i < N; i++) { View c = getChildAt(i); // ... // do some calculation // c.layout( childLeft, childTop, childRight, childBottom ); } } public static class LayoutParams extends ViewGroup.MarginLayoutParams { public Position position = position( 0, 0 ); public Span span = span( 1, 1 ); // Position and Span are local classes which are irrelevant here public LayoutParams( Position position, Span span ) { super(FILL_PARENT, FILL_PARENT); this.position = position; this.span = span; } public LayoutParams( Position position ) { this( position, span(1,1) ); } public LayoutParams() { this( position(0,0), span(1,1) ); } public LayoutParams(MarginLayoutParams params) { super(params); } public LayoutParams(LayoutParams that) { super(that); this.position = that.position; this.span = that.span; } public LayoutParams(Context context, AttributeSet attrs) { super(context, attrs); } } 

Класс используется следующим образом:

  WeightedGridLayout grid = (WeightedGridLayout) findViewById(R.id.mainMenu); LayoutInflater inflater = getLayoutInflater(); Button button = (Button)inflater.inflate(R.layout.buttonproperties, null); button.setText( "None" ); WeightedGridLayout.Position pos = WeightedGridLayout.position(colIdx,rowIdx); WeightedGridLayout.LayoutParams lp = new WeightedGridLayout.LayoutParams(pos); lp.setMargins(5,20,5,20); grid.addView(button, lp ); 

Вот свойства кнопки:

 <Button xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/default_button" android:gravity="center" android:textSize="@dimen/text" android:textColor="@color/text" > </Button> 

Текст кнопки появляется в верхней части кнопки, а не в центре, как следует. Что мне нужно сделать, чтобы получить текст в центр?

    Хорошо, я нашел проблему: я не смог переопределить onMeasure (). Макет дочерних представлений будет работать, только если onMeasure () вызывает функцию measure () в какой-то момент. Вот хороший рабочий пример http://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/ . Я просто хочу, чтобы официальная документация для пользовательских макетов упоминала этот момент.

    Intereting Posts
    Нужны учебные пособия AIDL Как разместить вертикально ViewPager в горизонтальном режиме ViewPager Android – добавление Subitem к списку Разница между onStart () и onResume () Android Data Binding: наблюдаемый список адаптера RecyclerView Как решить для viewpager: указанный ребенок уже имеет родителя. Вы должны сначала вызвать removeView () родителя ребенка Пользовательская форма Linearlayout с изогнутой стороной в android Обнаружено оверлей экрана – как справиться с этим в приложении наложения экрана Отключить пробел в EditText android Проверка на стороне сервера ответов на лицензирование на Android Market с помощью PHP Выполнение не выполнено для задачи ': app: shrinkReleaseMultiDexComponents' Parse CorodvaPush Ionic: Android не показывает уведомления, когда приложение в фоновом режиме Loader и LoaderManager – как определить, активен ли текущий загрузчик и работает ли он? ViewFlipper внутри Remoteview showNext () и showPrevious () не работает Установить apk в фоновом режиме с помощью busybox