0

У меня есть следующие классы:тяжесть ребенка TextView не работает с пользовательским ViewGroup

public class MyGridView extends ViewGroup { 
... 
@Override 
public void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { 

super.onSizeChanged(xNew, yNew, xOld, yOld); 
// do calculations for drawing bounds of child views 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    View child; 
Rect rect; 

for (int i=0; i < getChildCount(); i++) { 
    child = getChildAt(i); 

    rect = getBoundsAtChildIndex(i) 
     child.layout(rect.left, rect.top, rect.right, rect.bottom); 
    } 
} 
... 
} 

И

public class MyAdapter { 

public void setMyGridView(MyGridView myGridView) { 

// add a single TextView to my grid view 
textView = createTextView(context); 
addTextViewToGrid(textView); 
container.add(textView); 
} 

private TextView createTextView(Context context) { 
    TextView textView = new TextView(context); 

    textView.setText("1"); 
    textView.setTextColor(0xffffffff); 

    textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f); 
    textView.setTypeface(typeface); 

    textView.setGravity(Gravity.CENTER | Gravity.FILL); 
// textView.setGravity(Gravity.RIGHT); // other tries to see gravity 
// textView.setGravity(Gravity.FILL); 

    return textView; 
} 

private void addTextViewToGrid(TextView textView) { 
    myGridViewPtr.addView(textView, ViewGroup.LayoutParams.MATCH_PARENT, 
      ViewGroup.LayoutParams.MATCH_PARENT); 
} 
... 
} 

Я создал вид пользовательскую сетки и адаптер, где его дети рисуют на экран на правильный размер и местоположение. Однако их гравитация, установленная в createTextView(), не наблюдается.

Я могу установить фоновое изображение в textView и увидеть его заполнить его пространство в сетке.

Наоборот, текст в textView всегда рисуется в верхнем левом углу, и он всегда остается в размере текста, который я устанавливал на 12 с, а не на шкале, чтобы соответствовать с помощью Gravity.FILL.

Предпочтительно текст будет масштабироваться, чтобы соответствовать и центрировать в текстовом виде.

РЕДАКТИРОВАТЬ

Я добавил следующий метод для onMeasure() в ViewGroup:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    int width = getMeasuredWidth(); 
    int height = getMeasuredHeight(); 

    doUpdateOnSizeChanged(width, height); 

    for (int i = 0; i < getChildCount(); i++) 
     getChildAt(i).measure((int) viewDim.x, (int) viewDim.y); 

    setMeasuredDimension(width, height); 
} 

Дети должны быть одинаковой высоты, ширины, как и друг с другом. Код примера Android для ViewGroup более сложный, чем я требую. Например, я не получаю максимальную ширину и высоту всех детей.

Для моего onMeasure() ширина ребенка, высота в ViewDim - это ширина, высота целых чисел, которые вычисляются в doUpdateOnSizeChanged, чтобы быть меньше, чем getMeasuredWidth, getMeasuredHeight.

В результате текст выравнивается в нижнем левом углу TextView.

+0

читать о onMeasure – pskink

+0

Как, как по мере идет из примеров, которые я смотрел, он в основном измерения, как только чтение, чтобы вычислить ширину и высоту самой группы просмотра, а затем, наконец, вызывает вызов setMeasured. Я не совсем понимаю, какой метод мог бы что-то сделать для измерения и измерения. –

ответ

1

onMeasure необходимы незначительные корректировки, в основном необходимости полагаться на MeasureSpec:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

    int width, height; 
    int cWidth1, cHeight1; 

    width = MeasureSpec.getSize(widthMeasureSpec); 
    height = MeasureSpec.getSize(heightMeasureSpec); 

    doUpdateOnSizeChanged(width, height); 


    cWidth1 = (int)viewDim.x; cHeight1 = (int)viewDim.y; 

    measureChildren(MeasureSpec.makeMeasureSpec(cWidth1, MeasureSpec.EXACTLY), 
      MeasureSpec.makeMeasureSpec(cHeight1, MeasureSpec.EXACTLY)); 

    setMeasuredDimension(width, height); 
}