2012-01-11 1 views
1

У меня есть пользовательский вид с четырьмя кнопками. Я создал представление на 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? Как я могу центрировать текст по вертикали?

+1

Что такое 'cutomView' у вас есть? Не могли бы вы объяснить это больше? – iTurki

+0

Это имя CopyOfGameView здесь. Он имеет четыре кнопки и не имеет xml-макета. Его макет заполнен пользовательскими кнопками (из внутреннего класса ButtonView) через onLayout и методом сброса. Вы можете поместить экземпляр этого в свой main.xml приложения HelloWorld и посмотреть на него. – Herrbert74

+0

Хорошо. Я предполагаю, что вы поместили этот CopyOfGameView в другой макет (скажем, LinearLayout). Можете ли вы попытаться добавить атрибут гравитации в этот LinearLayout xml со значением CENTER_HORIZONTAL? Если это не сработает, попробуйте сделать это снова, после того как вы прокомментируете строку setGravity() CopyOfGameView из вашего кода. Надеюсь (сделав это), что атрибут будет унаследован вашими кнопками. – iTurki

ответ

1

проект был возрожден под другим названием и с одного года опыта я был в состоянии решить эту проблему. Я также реализовал AutoResizeTextView, потому что он вписывается в проект. Я взял AutoResizeTextView из следующего сообщения: Auto Scale TextView Text to Fit within Bounds

Но я должен был изменить его, поскольку это решение применяет измеренные измерения в методе onLayout. Но мне нужны размеры при измерениях, поэтому я переместил эту логику с onLayout на onMeasure.

В основном я унаследовал ButtonView от LinearLayout, дал ему ребенка AutoResizeTextView и играл с Android Measurement (onMeasure, onLayout и макет).

Помните, что я не мог использовать решение Chase наследования целого представления из LinearLyout, потому что я анимировал ButtonViews.

Информация об измерении: Я измерил ButtonView в onMeasure CopyOfGameView, а затем измерил AutoResizeTextView в onMeasure ButtonView. Затем в методе компоновки ButtonView я центрировал TextView вертикально.

0

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

Что, вероятно, происходит с вашими кнопками, так это то, что высота макета установлена ​​для обертывания содержимого, что делает их такими же высокими, как текст при измерении. Это приведет к тому, что текст окажется вертикально выровненным вверх, даже если вы указываете гравитацию центра. Чтобы исправить это, вам нужно будет рассчитать и установить размеры (высота и ширина LayoutParams) ваших видов кнопок (вызов buttonView.layout() этого не сделает).

Как подсказка, попробуйте установить цвет фона в виде кнопок, чтобы лучше понять положение и размер ваших представлений.

+0

Я думал то же самое, обертывание контента иногда может испортить вещи. – ArcDare

+0

Да, фоновая цветовая галстук помогает мне все время. Если этот ответ поможет, не забудьте рассмотреть голосование или принятие :) – Chase

+0

@Chase: Боюсь, это не поможет. Как вы можете видеть, у меня уже есть растянутый фон. На самом деле проблема в том, что теперь, когда у меня есть фон, этот провал выделяется намного больше. Возможно, моя реализация неверна. Не могли бы вы предоставить код? Что бы вы изменили на что? – Herrbert74

0

Вы можете добавить более подробную информацию? я считаю, нужно указать этот

setLayoutParams (новые LayoutParams ( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

так, чтобы вы могли установить его в центр ... , потому что я думаю, что по умолчанию для Android является то, что он заворачивает его содержание

setLayoutParams (новые LayoutParams ( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams. ОБЕРНУТЬ СОДЕРЖИМОЕ)); так что вам не нужно, чтобы настроить его больше ....

добавьте скриншот ... так что мы могли бы помочь вам :)

0

вам необходимо установить макет Params, как это

LayoutParams lp;
lp = (LayoutParams) buttonView.getLayoutParams();
lp.gravity = Gravity.CENTER;
buttonView.setLayoutParams(lp);

Смежные вопросы