Android - Почему TextView отображается с высотой? - PullRequest
5 голосов
/ 17 ноября 2011

У меня тут странная проблема.В основном у меня есть TextView без текста по умолчанию.Я бы ожидал, что он будет иметь высоту 0, так как он не имеет содержимого, но, похоже, между элементами выше и ниже есть разрыв.Если я установлю высоту в XML в 0, а затем попробую изменить ее с помощью Java-кода, тогда высота не будет сброшена.

Как установить высоту равной 0, если содержимое пустое, но затем разрешитьэто должно быть изменено программно?

Вот код, который у меня есть:

<TextView 
    android:gravity="center_horizontal|center_vertical"
    android:id="@+id/connectionStatus"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:textSize="18px"
    android:textStyle="bold">
</TextView>

и код Java это:

    private void getConnectionStatus()
{
    if (hasConnection() == true)
    {
        //do something
    }
    else
    {
        connectionStatus.setHeight(48);
        connectionStatus.setText("No Internet Access");
    }   
}

Ответы [ 3 ]

6 голосов
/ 17 ноября 2011

Используйте видимость "ушел" внутри макета XML. Затем в коде Java вызовите connectionStatus.setVisibility(View.VISIBLE);

2 голосов
/ 17 ноября 2011

Компоненты могут по-прежнему отображать себя, даже если у них нет содержимого. Например, могут отображаться границы или их видимая область. Чтобы он вообще не появлялся, нужно использовать setVisibility(View.GONE).

1 голос
/ 26 сентября 2017

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

import android.content.Context;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;

public class NoHeightWhenEmptyTextView extends android.support.v7.widget.AppCompatTextView {

    public NoHeightWhenEmptyTextView(Context context) {
        super(context);
    }

    public NoHeightWhenEmptyTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public NoHeightWhenEmptyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int newHeightMeasureSpec = heightMeasureSpec;
        if (TextUtils.isEmpty(getText())) {
            newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY);
        }
        super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);
        // ConstraintLayout totally ignores the new measured height after non-empty text is set.
        // A second call to requestLayout appears to work around the problem :(
        requestLayout();
    }
}
...