2015-11-09 2 views
0

Я создал пользовательский вид, который расширяет LinearLayout. Я добавляю их на экран через службу, как это:Как добавить TextView в пользовательское представление LinearLayout?

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
windowManager.addView(view, mParams); 

Это работает для простого пустого взгляда с только цветом фона. Но теперь я хочу, чтобы добавить TextViews, и я пытаюсь это:

TextView tv = new TextView(this); 
tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
tv.setText("Test text"); 
view.addView(tv); 

Однако TextViews не показываются. Что мне не хватает?

EDIT: Я только заметил, что TextView рисуется, если удалить этот перекрытый метод на настраиваемом представлении:

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     setMeasuredDimension(getDesiredWidth(), getDesiredHeight()); 
    } 

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

+0

вызов 'super (...)' then – pskink

+0

Вызов super.onMeasure (widthMeasureSpec, heightMeasureSpec) результатов отображения TextView, но все остальные представления не отображаются. –

+0

Что такое getDesiredWidth()/getDesiredHeight()? в пикселях – pskink

ответ

1

Я лично пошел вниз по маршруту инфляции, так как в прошлом были головные боли, вызванные программным добавлением просмотров. Вот a quick example of a custom view, расширенный от LinearLayout, завышенный от файла макета XML, с общедоступным методом для установки значения встроенного textview.

Ключевая бит это:

private TextView embeddedTextView; 

.. 

private void init() { 

    LayoutInflater.from(getContext()).inflate(
      R.layout.linear_layout_with_textview_layout, this); 

    embeddedTextView = (TextView) findViewById(R.id.embedded_text_view); 

} 

public void setEmbeddedTextViewText(String text) { 

    embeddedTextView.setText(text); 
} 

Я беру этот подход, как вы выгрузить различные стилизованные макеты в XML и использовать тот же пользовательский вид; правильное повторное использование кода. Меньшая работа в долгосрочной перспективе.

Редактировать: Вот a way of hiding the textview by default, or an empty string "".

+0

Но таким образом я добавлю TextView к каждому виду. Я хочу добавить его только для одного из видов. –

+1

Тогда вы можете использовать ** visbility: gone ** в TextView в XML и ** setVisibility (VISIBLE) **, если вы установите текст. Когда он ушел, он не появляется нигде в представлении и игнорируется во время компоновки. Я добавил это к примеру GitHub. – MattMatt

+0

Спасибо, мне удалось восстановить эффект, который я хотел с помощью этого метода! –

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