Иметь только один размер для нескольких авторазмеров TextViews - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть макет с разными полями, каждый из которых содержит несколько текстовых представлений в похожем макете.

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

В идеале я хотел бы иметь возможность "связать" несколько объектов TextView (находится в совершенно разных местах), поэтому механизм автоматического определения размера знает, что все они должны иметь одинаковый размер текста (придерживайтесь минимального значения, поскольку один текст может быть длиннее других).

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Это немного отличается (я думаю) от того, что, возможно, искал OP, но мне нужно было для конкретного представления, содержащего несколько объектов TextView, после того как было определено, что макет имеет размерсамый маленький TextView становится размером для всех TextView.Поэтому я сделал это и вставил в метод OnViewCreated () фрагмента, в котором живут мои TextViews:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            Timber.d("Lifecycle: In onViewCreated() of WelcomeFragment adjusting text fields");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } else {
                //noinspection deprecation
                view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }

            // Get all text views and find the smallest size and set them all to that
            int childCount = ((ViewGroup)view).getChildCount();
            float f = -1;
            ArrayList<AppCompatTextView> textViewArrayList = new ArrayList();
            for (int x = 0; x < childCount; x++) {
                View v = ((ViewGroup) view).getChildAt(x);
                if ( v instanceof androidx.appcompat.widget.AppCompatTextView) {
                    textViewArrayList.add((androidx.appcompat.widget.AppCompatTextView)v);
                    if ( f == -1) {
                        // Handle edge case - first TextView found initializes f
                        f = Math.max(f, ((androidx.appcompat.widget.AppCompatTextView) v).getTextSize());
                    } else {
                        f = Math.min(f, ((androidx.appcompat.widget.AppCompatTextView) v).getTextSize());
                    }
                }
            }
            int[] uniformSize = new int[]{(int) f};
            for (int x = 0; x < textViewArrayList.size(); x++) {
                TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(textViewArrayList.get(x), uniformSize, TypedValue.COMPLEX_UNIT_PX);
            }
        }
    });
}
0 голосов
/ 21 сентября 2018

Обновлено:

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

SizeAwareTextView.java:

package com.aminography.textapp;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.util.AttributeSet;

public class SizeAwareTextView extends AppCompatTextView {

    private OnTextSizeChangedListener mOnTextSizeChangedListener;
    private float mLastTextSize;

    public SizeAwareTextView(Context context) {
        super(context);
        mLastTextSize = getTextSize();
    }

    public SizeAwareTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mLastTextSize = getTextSize();
    }

    public SizeAwareTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mLastTextSize = getTextSize();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mLastTextSize != getTextSize()) {
            mLastTextSize = getTextSize();
            if (mOnTextSizeChangedListener != null) {
                mOnTextSizeChangedListener.onTextSizeChanged(this, mLastTextSize);
            }
        }
    }

    public void setOnTextSizeChangedListener(OnTextSizeChangedListener onTextSizeChangedListener) {
        mOnTextSizeChangedListener = onTextSizeChangedListener;
    }

    public interface OnTextSizeChangedListener {

        void onTextSizeChanged(SizeAwareTextView view, float textSize);
    }
}

MainActivity.java

package com.aminography.textapp;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.widget.EditText;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final SizeAwareTextView textView1 = findViewById(R.id.textView1);
        final SizeAwareTextView textView2 = findViewById(R.id.textView2);
        final SizeAwareTextView textView3 = findViewById(R.id.textView3);

        final List<SizeAwareTextView> textViewList = new ArrayList<>();
        textViewList.add(textView1);
        textViewList.add(textView2);
        textViewList.add(textView3);

        SizeAwareTextView.OnTextSizeChangedListener onTextSizeChangedListener = new SizeAwareTextView.OnTextSizeChangedListener() {
            @SuppressLint("RestrictedApi")
            @Override
            public void onTextSizeChanged(SizeAwareTextView view, float textSize) {
                for (SizeAwareTextView textView : textViewList) {
                    if (!textView.equals(view) && textView.getTextSize() != view.getTextSize()) {
                        textView.setAutoSizeTextTypeUniformWithPresetSizes(new int[]{(int) textSize}, TypedValue.COMPLEX_UNIT_PX);
                    }
                }
            }
        };

        for (SizeAwareTextView textView : textViewList) {
            textView.setOnTextSizeChangedListener(onTextSizeChangedListener);
        }

        ((EditText) findViewById(R.id.editText)).addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void afterTextChanged(Editable editable) {
                textView1.setText(editable.toString());
            }
        });
    }

}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">

    <com.aminography.textapp.SizeAwareTextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#DEDEDE"
        android:text="Here is the first TextView"
        android:textSize="26sp"
        app:autoSizeMinTextSize="10sp"
        app:autoSizeStepGranularity="0.5sp"
        app:autoSizeTextType="uniform" />

    <com.aminography.textapp.SizeAwareTextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:background="#DEDEDE"
        android:text="Here is the second TextView"
        android:textSize="26sp"
        app:autoSizeMinTextSize="10sp"
        app:autoSizeStepGranularity="0.5sp"
        app:autoSizeTextType="uniform" />

    <com.aminography.textapp.SizeAwareTextView
        android:id="@+id/textView3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:background="#DEDEDE"
        android:text="Here is the third TextView"
        android:textSize="26sp"
        app:autoSizeMinTextSize="10sp"
        app:autoSizeStepGranularity="0.5sp"
        app:autoSizeTextType="uniform" />

    <android.support.v7.widget.AppCompatEditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Here is the first TextView" />

</LinearLayout>

Конечный результат:

enter image description here

...