Android - EditText печатает медленно - PullRequest
5 голосов
/ 27 марта 2012

У меня есть EditText, который МЕДЛЕННО реагирует при наборе текста.Задержка достаточно раздражает, чтобы я мог найти решение.Я провел некоторое исследование и обнаружил, что SO-поток EditText запаздывает при наборе текста , и он предлагает переместить код в собственный поток.Я сделал это, но я все еще испытываю отставание.

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

После просмотра комментариев ниже (спасибо сказке), я знаю, что новая тема не нужна.Но помещение кода обратно в событие onTextChanged или afterTextChanged по-прежнему вызывает медленный ответ.Я изменил код, чтобы отразить последние изменения:

xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_weight="1" >

    <LinearLayout android:orientation="horizontal" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="2dp"
        android:layout_marginRight="2dp" > 
        <include 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" 
            layout="@layout/right_layout_header" />             
    </LinearLayout>

<ScrollView 
   android:layout_width="match_parent" 
   android:layout_height="0dp" 
   android:layout_weight="1"
   android:layout_marginRight="5dp"
   android:layout_marginBottom="5dp">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:shrinkColumns="1"
        android:drawable="@drawable/light_bg" >

        <TableRow
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:shrinkColumns="1">
                <TextView
                    android:id="@+id/tvSummaryBold"
                    android:layout_width="wrap_content"
                    android:textStyle="bold"
                    android:gravity="left"
                    android:text="@string/Summary"
                    style="@style/IssueDetailsLabelTextView" />
        </TableRow>
        <TableRow
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:shrinkColumns="1">

            <EditText
                    android:id="@+id/txtSummary" 
                    android:layout_width="match_parent" 
                    android:layout_height="match_parent" 
                    android:hint="@string/SummaryDefaultText" 
                    android:maxLength="255"
                    android:singleLine="true"
                    android:layout_weight="1"

                />
        </TableRow>
        <TableRow>
                <TextView 
                    android:id="@+id/tvCharactersRemaining"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="@color/Gray"
                    android:paddingLeft="5dp"
                    />
        </TableRow>
    </TableLayout>
  </ScrollView>
</LinearLayout>

Вот код фрагмента:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    try
    {
        vView = inflater.inflate(R.layout.submit_issue, container, false);

        //Setup initial "characters remaining" text.
        mCharsRemaining = (TextView)vView.findViewById(R.id.tvCharactersRemaining);
        mCharsRemaining.setText(String.valueOf(iMaxChars) + ' ' + getString(R.string.CharsRemaining));

        //Event for counting the characters remaining.
        mSummaryEditText.addTextChangedListener(TextEditorWatcher);

        new LoadPOCsTask().execute();   
    }
    catch (Exception e)
    {
        Errors.LogError(e);
    }
    return vView;           
}

Событие TextEditorWatcher:

private final TextWatcher TextEditorWatcher = new TextWatcher() { 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

    } 

    public void onTextChanged(CharSequence s, int start, int before, int count) { 

        int iMaxCharsRemaining = (iMaxChars - s.length());
        mCharsRemaining.setText("Static Text "); //Intentionally put static text to see if problem still occurs, and yes it does.
    } 

    public void afterTextChanged(Editable s) { 
    } 
}; 

Я не могу понять, почему он все еще отстает при наборе текста.Если я удаляю событие addTextChangeListener, то оно работает нормально.Идеи?

Ответы [ 4 ]

9 голосов
/ 24 июня 2013

У меня была похожая проблема с использованием EditText внутри ListView, которая была исправлена ​​путем изменения EditText width на 0dp с использованием взвешенных значений ширины для соответствия / заполнения родительского элемента.

Я не знаю наверняка, почему это произошло, однако я считаю, что это происходит потому, что когда ширина EditText установлена ​​для переноса содержимого, он будет сам подстраиваться / перерисовываться, чтобы все соответствовало, иListView также попытается перерисовать себя так, чтобы все подходило.Поэтому, если EditText имеет фиксированную ширину, эта перерисовка больше не требуется.

2 голосов
/ 04 августа 2017

Я обнаружил, что отключение предиктивного текста помогло.

android:inputType="text|textNoSuggestions"
2 голосов
/ 19 марта 2015

Редактировать AndroidManifest:

Мой старый код

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" />

Мой новый код

<uses-sdk android:minSdkVersion="8" />

Я только что убрал targetSdkVersion и отставание исчезло ...

0 голосов
/ 27 марта 2012

Когда вы набираете текст, onTextChanged вызывается снова и снова, поэтому вы снова и снова запускаете новую тему (EditTextWatcherTask). Это будет потреблять много ресурсов системы.

Кроме того, поток предназначен для задачи, которая требует много времени для ее завершения, поэтому в вашей ситуации вам не нужен поток, удалите задачу, просто поместите код вычисления в onTextChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...