У меня есть пользовательский вид с четырьмя кнопками. Я создал представление на Java, потому что хочу анимировать кнопки. Я хочу центрировать текст на кнопках, но я могу сделать это только горизонтально (влево-вправо), но не вертикально. Текст прикреплен к вершине.Невозможно установить гравитацию с помощью setGravity вертикально программно. Это ошибка или функция Android?
Вот самый основной код, который я мог бы получить рабочий:
public class CopyOfGameView extends ViewGroup implements View.OnClickListener {
private Main main;
public CopyOfGameView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CopyOfGameView(Context context) {
super(context);
}
public void reset(Main main) {
this.main = main;
removeAllViews();
for (int c = 0; c < 4; c++) {
ButtonView buttonView = new ButtonView(getContext(), c);
buttonView.setText("x");
buttonView.setTextSize(6);
buttonView.setGravity(Gravity.CENTER);
addView(buttonView);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int w = getWidth();
int h = getHeight();
int oneFourth = h/4;
int count = getChildCount();
for (int i = 0; i < count; i++) {
ButtonView buttonView = (ButtonView) getChildAt(i);
int left = 0;
int top = oneFourth * buttonView.getRow();
int right = w;
int bottom = oneFourth * buttonView.getRow() + oneFourth;
buttonView.layout(left, top, right, bottom);
}
}
public void onClick(View v) {}
protected ButtonView findButtonView(int row) {
int count = getChildCount();
for (int i = 0; i < count; i++) {
View v = getChildAt(i);
if (v instanceof ButtonView) {
ButtonView buttonView = (ButtonView) v;
if (buttonView.getRow() == row) {
return buttonView;
}
}
}
return null;
}
protected class ButtonView extends Button {
private int row;
protected ButtonView(Context context, int row) {
super(context);
this.row = row;
Drawable image = getResources().getDrawable(R.drawable.btn_black);
setBackgroundDrawable(image);
setClickable(true);
setOnClickListener(CopyOfGameView.this);
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
}
}
это нормально или это ошибка в Android? Как я могу центрировать текст по вертикали?
Что такое 'cutomView' у вас есть? Не могли бы вы объяснить это больше? – iTurki
Это имя CopyOfGameView здесь. Он имеет четыре кнопки и не имеет xml-макета. Его макет заполнен пользовательскими кнопками (из внутреннего класса ButtonView) через onLayout и методом сброса. Вы можете поместить экземпляр этого в свой main.xml приложения HelloWorld и посмотреть на него. – Herrbert74
Хорошо. Я предполагаю, что вы поместили этот CopyOfGameView в другой макет (скажем, LinearLayout). Можете ли вы попытаться добавить атрибут гравитации в этот LinearLayout xml со значением CENTER_HORIZONTAL? Если это не сработает, попробуйте сделать это снова, после того как вы прокомментируете строку setGravity() CopyOfGameView из вашего кода. Надеюсь (сделав это), что атрибут будет унаследован вашими кнопками. – iTurki