7

onTextChanged()我在方法中得到了 EditText 的文本及其长度TextWatcher
当我键入以添加字符时它工作正常,但是从文本中删除字符时getText()即使文本不为空也会出现空。这会随机发生,而不是每次我删除字符时都会发生。我观察到这主要发生在文本中有 3-4 个字符并且我按退格键时。

奇怪的是,这个问题只发生在设备上,而不是模拟器上。

布局文件:

<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()方法。但这并没有解决问题。

4

10 回答 10

1

我看不出有什么问题。的文本from_location应该改变,它确实改变了。

当您在代码中时,为什么要“检查” EditText( )。我不认为值在变化时必须是“稳定的”。from_locationTextWatcherEditText

也许发生的情况是,当您签入时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_locationgetText你会得到mText第二次setText,然后你会得到mTransformed答案。

如果你想检查这个只是改变

CharSequence cs = from_location.getText();
Log.d(... + cs + ...); // no need to call toString as implicit call.
...
Log.d(... + cs.length() + ...);
于 2013-08-09T20:52:01.813 回答
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());

        }

      });
  }


 }
于 2013-08-10T18:35:04.010 回答
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) {

          }
于 2013-08-08T04:55:01.083 回答
0

什么是 fromLocation ?您应该使用 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());            
}
于 2013-08-08T05:19:56.170 回答
0

我正在根据用户在 First EditText 上的输入更新其他 Second EditText 值,反之亦然。

因此,对于 First 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) {

        }
    });

希望这会对您有所帮助。如果 nits 对您没有帮助,请告诉我。

享受编码...... :)

于 2013-08-09T10:17:52.533 回答
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);

}

在你的 on create 中调用方法 search() 来初始化它。

于 2013-08-08T05:05:52.083 回答
0

如果您正在使用调试模式,请记住它有两个存储值的位置。在我的例子中,EditText 有 mText(Spannable String Builder),它的子字段(也是 mText)是带有 ID 的字段。可跨字符串生成器将返回 .toString() 的值。另一个将返回 .getText() 的值。

于 2013-08-01T12:49:11.540 回答
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());            

        }
    });
于 2013-08-08T10:34:12.617 回答
0

我确实有同样的问题。我的代码在大多数设备上运行良好,但在装有 Android 4.1.2 的 Motorola Razr i 上它随机返回一个空字符串。

我做了以下解决方法:

// 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(可能延迟)中修复了它。并且不影响其他设备上的行为。

在您的情况下,您可能需要对 fromLocation 进行一些额外的 != null 检查 - 在我的情况下,它永远不会为空。

于 2013-12-17T18:46:29.767 回答
0

尝试使用 onTextChange() 中的 CharSequence 应该与 fromLocation.getText() 返回的相同。

于 2013-08-05T20:15:45.480 回答