2013-08-01 3 views
7

Я получаю текст EditText и его длину в onTextChanged() методе TextWatcher.
Он отлично работает, когда я печатаю, чтобы добавлять символы, но при удалении символов из текста getText() пуст, даже если текст не пуст. Это происходит случайным образом, а не каждый раз, когда я удаляю символы. Я наблюдал, что это происходит в основном, когда в тексте есть 3-4 символа, и я нажимаю backspace.EditText.getText(). ToString() иногда возвращает ""

Странная часть заключается в том, что эта проблема возникает только на устройстве, а не на эмуляторе.

Макет файла:

<LinearLayout 
    style="@style/create_trip_activity_components_style" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="30dp" 
    android:gravity="center_vertical" 
    android:orientation="horizontal" > 

    <EditText 
     android:id="@+id/from_location" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginRight="5dp" 
     android:ems="10" 
     android:hint="@string/from_location_hint" 
     android:inputType="text" > 

     <requestFocus /> 
    </EditText> 

    <Button 
     android:id="@+id/use_current_button" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:onClick="useCurrentLocation" 
     android:text="@string/use_current" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 
</LinearLayout> 

Код:

fromLocation.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void afterTextChanged(Editable s) { 

    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 

    } 

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

     if (fromLocation == null) { 
      Log.d(TAG, "fromLocation is null................"); 
     } 

     Log.d(TAG, "fromLocation text : " 
        + fromLocation.getText().toString()); 
     Log.d(TAG, "fromLocation text length : " 
        + fromLocation.getText().length()); 
     Log.d(TAG, "S : " 
        + s); 
     Log.d(TAG, "S length : " 
        + s.length()); 
    } 
}); 

Примечание: Я попытался с помощью afterTextChanged() и beforeTextChanged() методов. Но это не решило проблему.

+0

редактируемые является CharSequence поэтому нет необходимости, чтобы преобразовать его в строку для вызова длины(). Просто говорю. Попробуйте выйти из AfterTextChanged (Редактирование s). –

+0

@DoctororDrive Пробовал в 'afterTextChanged()'. Еще одна проблема. – Geek

+0

может показать, как вы удаляете персонажа? – Sameer

ответ

0

Если вы проходили через режим отладки, имейте в виду, что в нем есть два места, где хранятся значения. В моем случае EditText имел mText (Spannable String Builder), и это подполе (также mText) - это номер с идентификатором. Выпущенный строковый построитель возвращает значение .toString(). Другой возвращает значение .getText().

+0

Не мог понять, что вы говорите. – Geek

0

Попробуйте использовать CharSequence s из onTextChange(), чтобы он был таким же, как тот, который был возвращен fromLocation.getText().

+0

s также дает пустую строку. – Geek

0
public void afterTextChanged(Editable s) { 
      if(s.length()>=6) 
      { 

      } 
      else{ 

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

      } 
0

Это может быть то, что вам нужно. Это код, который я использовал в проекте для поиска по строкам. У меня есть метод под названием mySearchMethod, не беспокойтесь об этом. Но я получаю мою редактировать текстовую строку на метод после того, как текст изменен ..

public void search(){ 
    // Notice I used a final edittext 
    final EditText editText = (EditText) findViewById(R.id.search); 


    // create the TextWatcher 
    TextWatcher textWatcher = 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) { 


       String searchQuery = editText.getText().toString(); 

       // This method is just something I did with the string I got 
       MySearchMethod(searchQuery); 




     } 
    }; 

    //we must add the textWatcher to our EditText 
    editText.addTextChangedListener(textWatcher); 

} 

Вызвать метод поиска() в кнопку Создать, чтобы инициализировать его.

+0

Пробовал использовать 'afterTextChanged'. Тот же вопрос. Также попробовал 'beforeTextChanged'. – Geek

+0

Вы настроили свой edittext именно так, как он есть в моем коде? – NightSkyCode

+0

просто скопируйте мой код, вызовите метод в вашем приложении create ... обязательно измените R ids – NightSkyCode

0

Что находится на месте? Вы должны использовать CharSequence, как показано ниже.

Попробуйте это ......

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

// if(fromLocation == null) { 
//   Log.e(TAG, "fromLocation is null."); 
// } 

Log.e(TAG, "fromLocation text : " + s.toString()); 
Log.e(TAG, "fromLocation text length : " + s.toString().length()); 

// Log.e(TAG, "fromLocation id : " + fromLocation.getId()); 
// Log.e(TAG, "fromLocation text : " + fromLocation.getText().toString()); 
// Log.e(TAG, "fromLocation text length : " + //fromLocation.getText().toString().length());    
} 
+0

Уже пробовал. Не работал. Такая же проблема с 'CharSequence'. – Geek

0

Попробуйте это, он будет работать ...

final EditText from_location = (EditText) findViewById(R.id.from_location); 

    from_location.addTextChangedListener(new TextWatcher() 
    { 
     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub    
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub    
     } 

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

      if(from_location == null) { 
       Log.v("", "fromLocation is null."); 
     } 

     Log.v("", "fromLocation id : " + from_location.getId()); 
     Log.v("", "fromLocation text : " + from_location.getText().toString()); 
     Log.v("", "fromLocation text length : " + from_location.getText().toString().length());    

     } 
    }); 
0

Я обновляю другое значение второго EditText на основе пользовательского ввода на первой EditText и наоборот.

Итак, для первого EditText я добавил TextWatche, как показано ниже, который никогда не разбивается и никогда не попадает ни в какие ошибки или исключения. Вы можете попробовать что-то подобное.

final EditText from_location = (EditText) findViewById(R.id.from_location); 

from_location.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if(!(from_location.getText().toString().equals(""))) { 
       Log.e(TAG, "fromLocation id : " + fromLocation.getId()); 
       Log.e(TAG, "fromLocation text : " + fromLocation.getText().toString()); 
       Log.e(TAG, "fromLocation text length : " + fromLocation.getText().toString().length()); 
      }else{ 
       Log.e(TAG, "fromLocation is null."); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) {} 
     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

Надеюсь, это поможет вам. Пожалуйста, дайте мне знать, если гниды не помогут вам.

Наслаждайтесь кодированием ....:)

+0

Это из моего вопроса. Я только что обновил код моего вопроса, чтобы иметь все переопределенные методы. – Geek

+0

@ Акаш, почему бы вам не попробовать мой код? он работает так, как вам нравится. Или дайте мне знать ваше фактическое требование. –

1

Я не вижу никаких проблем. Текст from_location должен измениться, и это произойдет.

Почему вы «проверяете» EditText (from_location), пока находитесь в коде TextWatcher. Я не думаю, что значение EditText должно быть «стабильным», когда оно меняется.

Возможно, что происходит, когда вы проверяете CharSequence в from_location, вы обновляетесь, а иногда вы можете его поймать только в середине изменения, иногда после.

вы проверяете, если (CharSequence s, int start, int before, int count) возвращаются ожидаемые значения ли?

Как я вижу в этой ситуации. Если вы хотите сделать какие-либо изменения в тексте, вы должны сделать их на аргументе String s метода afterTextChanged.

Я написал этот код, чтобы проверить, что происходит при изменении содержания EditText, может быть, это какой-либо

mEdtText.addTextChangedListener(new TextWatcher() { 
     private static final String TAG = "TextWatcher"; 
     private static final boolean DEBUG = true; 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      if (DEBUG) 
       Log.d(TAG, 
         "(onTextChanged) In \"" + s + "\" " + before 
           + " characters " 
           + " are being replaced at " + start 
           + " by " + count + " (" 
           + s.subSequence(start, start + count) + ")"); 
      if (DEBUG) 
       Log.d(TAG, 
         "(onTextChanged) mEdtText: \"" + mEdtText.getText() 
           + "\""); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      if (DEBUG) 
       Log.d(TAG, 
         "(beforeTextChanged) In \"" + s + "\" " + count 
           + " characters (" 
           + s.subSequence(start, start + count) 
           + ") are about to be replaced at " + start 
           + " by " + after); 
      if (DEBUG) 
       Log.d(TAG, 
         "(beforeTextChanged) mEdtText: \"" 
           + mEdtText.getText() + "\""); 

     } 
    } 

Если проверить исходный код EditText вы можете увидеть, что наследует метод getText от TextView и он возвращает CharSequence mText. Вы можете засеять еще один CharSequence mTransformed. И что в огромном методе setText есть момент, когда mText заменяется на mTransformed. Возможно, когда вы звоните from_location «s getText вы получаете mText и второй раз, когда вы делаете это после того, как setText ног, и вы получите mTransformed как ответ.

Если вы хотите, чтобы проверить это просто изменить

CharSequence cs = from_location.getText(); 
Log.d(... + cs + ...); // no need to call toString as implicit call. 
... 
Log.d(... + cs.length() + ...); 
+0

Итак, чтобы решить вопрос о получении 'mText', который может быть пустым в определенный момент времени, как вы сказали, что мне делать? – Geek

+0

BTW Я пробовал записывать 'CharSequence s' и возвращал то же значение, что и мой EditText. Более того, я попытался получить текст в методе 'afterTextChanged()', который должен работать, если проблема получает текст при его замене. Но он все еще дал пустой текст. Даже я сталкиваюсь с той же проблемой в методе 'beforeTextChanged()'. – Geek

+0

Итак, если я понимаю, что это ошибка. При удалении некоторых символов слова, которое вы ранее писали в 'EditText', методы:' beforeTextChanged', 'onTextChanged' и' afterTextChanged' возвращают пустую 'CharSequence' /' Editable', когда они не собираются? Например, . если у вас есть слово «Привет», и вы начинаете удалять, что происходит? Вы получаете пустую последовательность после удаления двух или трех символов, пока вы должны получить «Hel», «He» и т. Д. – Asincrono

0

Хорошо Вот решение, вместо того, чтобы текст, используя GetText, просто преобразовать CharSequence передается

onTextChanged(CharSequence s, int start, int before, 
        int count) 

обратного вызова с использованием s.toString()

Мой класс образцов выглядит следующим образом

package com.peshal.texttest; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    EditText fromLocation = (EditText) findViewById(R.id.editText1); 
    fromLocation.addTextChangedListener(new TextWatcher(){ 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
     Log.d("Current String is :" ,s.toString()); 

     } 

     }); 
    } 


} 
+1

Мой код, если вы видите, уже имеет 'Log.d (TAG," S: "+ s);'. Как вы думаете, что делает.toString() 'будет иметь значение сейчас? – Geek

0

я имел такую ​​же проблему. Мой код работал нормально на большинстве устройств, но на Motorola Razr i с Android 4.1.2 он случайно возвращал пустую строку.

я сделал следующий обходной путь:

// TextWatcher Methods 
@Override 
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) 
{ 
} 

@Override 
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) 
{ 
    fromLocation.post(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      Editable text = fromLocation.getText(); 
      //... now the string is not empty anymore 
     } 
    }); 

} 

@Override 
public void afterTextChanged(Editable editable) 
{ 
} 

Хотя я не знаю, почему возникла проблема - размещение его в Runnable (возможно, с задержкой) неподвижным его. И не повлияло на поведение других устройств.

В вашем случае вы, возможно, придется сделать некоторые дополнительные = NULL проверяет fromLocation - в моем случае его никогда не нулевой.

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