【问题标题】:addTextChangedListener() on EditText in a popupwindow android在弹出窗口android中的EditText上添加TextChangedListener()
【发布时间】:2014-11-10 09:45:23
【问题描述】:

我正在尝试创建一个弹出窗口,我可以在其中更改从按下按钮到显示图像之间的延迟。我已经阅读了 edittext 和 textwatcher 应该解决的问题,但我不断收到 NullPointerExeption。

这是您在设置中尝试设置延迟的部分。

else if(id == R.id.action_settings){
        LayoutInflater layoutInflater  = (LayoutInflater)getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
        View setpopView = layoutInflater.inflate(R.layout.setpop, null);
        final PopupWindow setpopWindow = new PopupWindow(setpopView,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        setpopWindow.setFocusable(true);
        setpopWindow.update();

        EditText delayTime = (EditText) setpopView.findViewById(R.id.editText1);
        delayTime.setText("" + timerTime);
        timerTime = Integer.parseInt(delayTime.getText().toString());

        delayTime.addTextChangedListener(new TextWatcher() {

            EditText delayTime = (EditText) findViewById(R.id.editText1);

              public void afterTextChanged(Editable s) {
                    delayTime.setText("" + timerTime);
              }

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

              public void onTextChanged(CharSequence s, int start, int before, int count) {
                   //TODO Auto-generated method stub
              }
        });


        ((TextView)setpopWindow.getContentView().findViewById(R.id.textDelay2)).setText("Current delay: " + timerTime + "sec");


        Button btnDismiss = (Button)setpopView.findViewById(R.id.setDismiss);
        btnDismiss.setOnClickListener(new Button.OnClickListener(){
            @Override
            public void onClick(View v){
                //TODO Auto-generated method stub
                setpopWindow.dismiss();
            }
        });  
        setpopWindow.showAsDropDown(btnDismiss, 50, 50);
    }

xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_margin="5dp"
android:background="@android:color/black"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">

<RelativeLayout
    android:layout_width="230dp"
    android:layout_height="300dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layout_margin="2dp"
    android:background="@android:color/darker_gray"
    android:orientation="vertical" >

    <Button
        android:id="@+id/setDismiss"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="Back" />

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:orientation="vertical" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="         Settings"
            android:textSize="22sp" />
    </RelativeLayout>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/seekBar"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="27dp"
        android:text="" />

    <TextView
        android:id="@+id/textDelay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/relativeLayout1"
        android:layout_below="@+id/relativeLayout1"
        android:text="Set result delay (sec)" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textDelay"
        android:layout_centerHorizontal="true"
        android:ems="10"
        android:inputType="number"
        android:text=""  >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textDelay2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textDelay"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="16dp"
        android:text="" />

</RelativeLayout>

LogCat

11-10 03:30:00.776: E/AndroidRuntime(30751): FATAL EXCEPTION: main
11-10 03:30:00.776: E/AndroidRuntime(30751): Process: com.gerfort.gerfortrps, PID: 30751
11-10 03:30:00.776: E/AndroidRuntime(30751): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
11-10 03:30:00.776: E/AndroidRuntime(30751):    at com.gerfort.gerfortrps.MainActivity$14.afterTextChanged(MainActivity.java:413)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.widget.TextView.sendAfterTextChanged(TextView.java:7472)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9246)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:957)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:501)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:216)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:33)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.view.inputmethod.BaseInputConnection.deleteSurroundingText(BaseInputConnection.java:243)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:382)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.os.Handler.dispatchMessage(Handler.java:102)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.os.Looper.loop(Looper.java:135)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at android.app.ActivityThread.main(ActivityThread.java:5070)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at java.lang.reflect.Method.invoke(Native Method)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at java.lang.reflect.Method.invoke(Method.java:372)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
11-10 03:30:00.776: E/AndroidRuntime(30751):    at      com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)

当我尝试编辑文本时,它总是崩溃。有任何想法吗?提前致谢!

【问题讨论】:

  • 哦,顺便说一句,我对整体编程很陌生,所以有些事情对我来说并不明显:)
  • post logcat 从中我们可以看到错误在哪里
  • 抱歉,忘记了。现在应该编辑它。
  • 调试你的代码 timerTimenull 并且不需要在 addTextChangedListener 中再次初始化 EditText
  • 现在有一个我以前从未见过的错误。我什至没有时间查看错误是什么,因为 logcat 正在发送垃圾邮件“E/RichInputConnection(1362):无法连接到编辑器以检索文本。”我有时间看到的是关于分配内存的东西,程序只是冻结了一段时间然后退出,没有“应用程序名称已停止”弹出窗口。

标签: android nullpointerexception android-edittext popupwindow textwatcher


【解决方案1】:

这样试试

final EditText delayTime = (EditText) setpopView.findViewById(R.id.editText1);
delayTime.setText(String.valueOf(timerTime));
timerTime = Integer.parseInt(delayTime.getText().toString());

delayTime.addTextChangedListener(new TextWatcher() {

      public void afterTextChanged(Editable s) {
           if(!s.toString().trim().equalsIgnoreCase("")) {
               timerTime = Integer.parseInt(s.toString().trim());
               //delayTime.setText(String.valueOf(timerTime));
           } else {
               timerTime = 0;//set initial value of timerTime
               //delayTime.setText(String.valueOf(timerTime));
           }                
      }

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

      public void onTextChanged(CharSequence s, int start, int before, int count) {
           //TODO Auto-generated method stub
      }
});

【讨论】:

  • Nvm,我没有看到你编辑了你的代码。现在发生的是 LogCat 垃圾邮件“显式并发标记扫描 GC 释放了 8538(305KB)AllocSpace 对象,2(64KB)LOS 对象,250% 空闲,11MB/14MB,暂停 1.589 毫秒,总共 13.533 毫秒”,直到程序崩溃。然后错误在一段时间后出现,它是“java.lang.StackOverflowError: stack size 8MB”
  • comment delayTime.setText(String.valueOf(timerTime)); TextWatcher 中的行运行编辑后的答案
  • 解决了!非常感谢您的帮助。
【解决方案2】:

有时,findViewById 的行为类似于异步调用。我建议你改变

EditText delayTime = (EditText) setpopView.findViewById(R.id.editText1);

final EditText delayTime = (EditText) setpopView.findViewById(R.id.editText1);

并删除

EditText delayTime = (EditText) findViewById(R.id.editText1);

delayTime.addTextChangedListener(new TextWatcher() {

            **EditText delayTime = (EditText) findViewById(R.id.editText1);**

【讨论】:

    【解决方案3】:

    您所做的每个输入都被“”和一个 NullString 替换。原因是

    delayTime.setText("" + timerTime);
    

    自己调用

     afterTextChanged(Editable s)
    

    递归并用

    替换EditText
    "" + timerTime
    

    为空。 所以不要调用 setText(),而是尝试类似

    afterTextChanged(Editable s){
       char lastCharacter = s.charAt(s.length() - 1);
       if (lastCharacter == '\n') {
          timerTime = Integer.parseInt(s);
       }
    }
    

    '\n'代表回车键。

    【讨论】:

      【解决方案4】:

      它崩溃是因为你有一个无限循环:

      1. 您编辑 EditText
      2. TextWatcher 检测到 EditText 内容已更改(在步骤 1 中),因此它执行 afterTextChanged
      3. TextWatcher 检测到 EditText 内容已更改(在步骤 2 中),因此它执行 afterTextChanged
      4. TextWatcher 检测到 EditText 内容已更改(在步骤 3 中),因此它执行 afterTextChanged

      ...等等。

      你必须控制那个无限循环。最简单的方法是使用标志,如下所示:

      boolean disableTextWatcher;
      

      .

          disableTextWatcher = false;
          delayTime.addTextChangedListener(new TextWatcher() {
      
                      EditText delayTime = (EditText) findViewById(R.id.editText1);
      
                        public void afterTextChanged(Editable s) {
                           if (!disableTextWatcher) {
                              disableTextWatcher = true;
                              delayTime.setText("" + timerTime);
                              disableTextWatcher = false;
                            }
                        }
      
                        public void beforeTextChanged(CharSequence s, int  start, int count, int after) {
                              //TODO Auto-generated method stub
                        }
      
                        public void onTextChanged(CharSequence s, int start, int before, int count) {
                             //TODO Auto-generated method stub
                        }
                  });
      

      【讨论】:

      • 看看 Rames Palanisamy 的回答,你的代码中有几个错误。
      • 它是不可编辑的,因为一旦用户写了一些东西,你就重写了内容。你想通过重写EditText的内容来达到什么目的?
      • timerTime 是我在 "CountDownTimer((timerTime * 1000), 1000)" 中使用的一个 int,我希望它可以通过用户的 edittext 进行编辑。我想做“timerTime = Integer.parseInt(delayTime.getText().toString());”用户输入数字后。
      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多