Сделать счетчик текста всегда видимым - PullRequest
0 голосов
/ 01 октября 2018

Проблема: счетчик символов запускается с экрана

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

Это то, что у меня есть в макете xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android.support.design="http://schemas.android.com/tools">

<android.support.design.widget.TextInputLayout
    android:id="@+id/textContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:counterEnabled="true"
    android:overScrollMode="never"
    android.support.design:errorEnabled="true"
    android.support.design:hintEnabled="true"
    app:counterMaxLength="@integer/global_comments_size">

    <android.support.design.widget.TextInputEditText
    android:id="@+id/action_global_comment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="start|center_vertical"
    android:layout_marginTop="8dp"
    android:hint="@string/edit_comments"
    android:imeOptions="actionDone"
    android:inputType="textMultiLine"
    android:scrollbars="vertical"
    android:maxLength="@integer/global_comments_size"
    />
</android.support.design.widget.TextInputLayout>

</RelativeLayout>

счетчик виден до тех пор, пока свиток не покинет экран

Счетчик становится невидимым как текстпрокрутите экран

Возможные варианты:

Я вижу следующие три варианта в качестве возможных решений.

  1. Создайте нижнюю панель инструментов и добавьте счетчик программно

  2. Создайте всплывающее окно программно после достижения максимального размера

  3. Каким-то образом сконфигурируйте TextInputLayout в xml или используйте какую-нибудь другую библиотеку.

Я бы предпочел вариант 3. Однако сейчас я в растерянности и не могу найти никакого решенияили намека ни на документацию, ни на поиск в форумах.


Решено

Решение найдено

После прочтения я обнаружил, чтоНа stackoverflow здесь уже задавался вопрос о счетчике, работающем на экране с предложениями решения.Тем не менее, решение не так, как ожидалось, с простой записью XML, но должно быть сделано программно

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

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

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

К сожалению, не существует способа простой настройки свойства xml, которое позволяло бы счетчику оставаться в видимой области экрана.

Решение заключается в использовании класса интерфейса TextWatchers, который, к счастью, требует всего несколько строк кода.

1) Create res / values ​​/ strings.xml файл для определения константы для максимального размера символа

<integer name="max_comment_size">50</integer>

2) добавьте следующие два представления в вашу деятельность т.е. res / layout / activity_main.xml

Мне нравится, когда счетчик сверху.Вы можете поменять местами TextView и TextEdit, если предпочитаете располагать их внизу.

<TextView
   android:id="@+id/constraint_textview"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Remaining characters/Maximum characters: --/--" />

<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="textMultiLine"
    android:maxLength="@integer/max_comment_size" />

Обратите внимание, что textMultiLine не ограничивает количество максимальных строк для поля EditText.Это только ограничивает размер макета.С maxLength вы можете указать максимальное количество разрешенных символов.

3) Используйте TextWatcher в Java-файле для подсчета введенных символов и отображения их в Java-файле TextView в моемНапример: java / com / example / mycompany / textcounter / MainActivity.java

Интерфейсный класс TextWatcher имеет три метода, которые необходимо реализовать.Тем не менее, только onTextChange () представляет интерес для нас.

    public class MainActivity extends AppCompatActivity {

        private TextView mTextView;
        private EditText mEditText;
        private final TextWatcher mTextEditorWatcher = new TextWatcher() {
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {  } //nothing to be done here

            public void onTextChanged(CharSequence s, int start, int before, int count) {        
                Integer max_comment = getResources().getInteger(R.integer.max_comment_size);

                mTextView.setText("Remaining characters" + "/Maximum characters: "+ String.valueOf(max_comment-s.length()) +"/" + max_comment);
            }

            public void afterTextChanged(Editable s) { } //nothing to be done here
        };

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

            //Initializing views
            mEditText = (EditText) findViewById(R.id.editText);
            mTextView = (TextView) findViewById(R.id.constraint_textview);

           mEditText.addTextChangedListener(mTextEditorWatcher);

        }        
    }

Дополнительные примечания:

Решение основано на информации, предоставленной здесь о счетчике с экрана и здесь о том, как использовать TextWatcher

См. Документацию для Android по TextWatcher и TextEdit , тоже.

Я ограничил максимальное количество вводимых символов в поле TextEdit с помощью maxLength.Если вам нужно ограничить максимальное количество строк, см. Обсуждение и возможные решения здесь и здесь или используйте поиск по stackoverflow.

0 голосов
/ 01 октября 2018

Все, что вам нужно сделать, это использовать alignParent следующим образом

       <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android.support.design="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.TextInputEditText
    android:id="@+id/action_global_comment"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="start|center_vertical"
    android:layout_marginTop="8dp"
    android:hint="@string/edit_comments"
    android:imeOptions="actionDone"
    android:inputType="textMultiLine"
    android:maxLength="@integer/global_comments_size"
    android:layout_alignParentTop="true"
    android:layout_above="@+id/textContainer"
    android:scrollbars="vertical" />

<android.support.design.widget.TextInputLayout
    android:id="@+id/textContainer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:overScrollMode="never"
    android.support.design:errorEnabled="true"
    android.support.design:hintEnabled="true"
    app:counterEnabled="true"
    app:counterMaxLength="@integer/global_comments_size"/></RelativeLayout>
...