【问题标题】:Android: NullPointerException in onTextChanged() method with EditTextAndroid:使用 EditText 的 onTextChanged() 方法中的 NullPointerException
【发布时间】:2015-07-16 23:36:06
【问题描述】:

Android 开发者您好,

当 EditText 更改其文本时,我的 onTextChanged() 方法中不断收到 NullPointerException。 并非适用于所有智能手机。 LG G2 不会抛出任何错误,但例如三星 Galaxy S 4 会。我有两个 EditText。通过输入数字,程序获取两个值并计算一些东西。真正奇怪的是,当键盘打开时,我按任意键,然后按 DEL 键一切正常。

这里有一些代码:

EditText bestellt = new EditText(this);
bestellt.setInputType(InputType.TYPE_CLASS_NUMBER);
bestellt.setGravity(Gravity.CENTER_HORIZONTAL);
bestellt.setEms(3);
bestellt.setTextAppearance(this, android.R.style.TextAppearance_Medium);
bestellt.setBackgroundColor(Color.parseColor("#DBF2FC"));
bestellt.setHint(Html.fromHtml("<small><small><small>" +
                "Bestellt" + "</small></small></small>"));

//bestellt.setOverScrollMode(View.OVER_SCROLL_NEVER);
bestellt.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI|EditorInfo.IME_FLAG_NAVIGATE_NEXT);
tempTableRow.addView(bestellt);
bestellt.setId(Integer.parseInt(Integer.toString(runde) + "90" + Integer.toString(i + 1) + "90" + Integer.toString(viewTeilID)));

//wieVieleReihen1 = tabellenLayout.getChildCount() - 1;
//scrollViewHor.setSmoothScrollingEnabled(false);

bestellt.setOnKeyListener(new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        viewEditText1 = v;
         /*if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {

               //Toast.makeText(getBaseContext(), "Done gedrueckt", Toast.LENGTH_SHORT).show();
               return true;
          }*/
         return false;
        }
    });

bestellt.addTextChangedListener(new TextWatcher() {

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

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

     //Toast.makeText(getBaseContext(), Integer.toString(v.getId()), Toast.LENGTH_LONG).show();

     //int wieVieleReihen = tabellenLayout.getChildCount() - 1;
     try{
         int id1, id2, id3, tempPZ;
         id1 = viewEditText1.getId();
         String[] parts = Integer.toString(id1).split("90");
         parts[2] = Integer.toString(Integer.parseInt(parts[2]) + 2);
         id3 = Integer.parseInt(parts[0] + "90" + parts[1] + "90" + parts[2]);
         parts[2] = Integer.toString(Integer.parseInt(parts[2]) - 1);
         id2 = Integer.parseInt(parts[0] + "90" + parts[1] + "90" + parts[2]);

         //kontrolle.setText("ID1: " + id1 + " ID2: " + id2 + " ID3: " + id3);
         //viewEditText1.requestFocus();
         /*INSIDE HERE SHOULD NOT BE A MISTAKE    
        try {//es müssen unbedingt werte eingegeben worden sein
        if (false) {
             //((EditText) findViewById(id1)).getText().toString().equals("") || ((EditText) findViewById(id1)).getText().toString().trim().length() == 0 || (((EditText) findViewById(id2)).getText().toString().equals("")) || ((EditText) findViewById(id2)).getText().toString().trim().length() == 0
             //Toast.makeText(getBaseContext(), "Werte eingeben und bestaetigen!", Toast.LENGTH_SHORT).show();
         } else
               tempPZ = 0; //keine  Ahnung warum

              //((EditText) findViewById(id1)).;

             tempPZ = berechnePunktzahl(Integer.parseInt(((EditText) findViewById(id1)).getText().toString()), Integer.parseInt(((EditText) findViewById(id2)).getText().toString()));
                        ((TextView) findViewById(id3)).setText(Integer.toString(tempPZ));

             int c;
             int summe = 0;
             int tempoID = 0;
             for (c = 0; c < runde; c++) {

             tempoID = Integer.parseInt((c + 1) + "90" + parts[1] + "90" + "3");

            summe = summe + Integer.parseInt(((TextView) findViewById(tempoID)).getText().toString());
             }

             ((TextView) findViewById(Integer.parseInt("222" + parts[1]))).setText(Integer.toString(summe));

            //punktZahlen.add(Integer.parseInt(parts[0])-1,tempPZ);

            //Integer sum = 0;
            //for ( Integer i : punktZahlen ) {
            //    sum += i;
            //}

           //((TextView) findViewById(Integer.parseInt("222"+parts[1]))).setText(Integer.toString(sum));
          } catch (Exception e) {
               //Toast.makeText(getBaseContext(), "Werte eingeben!", Toast.LENGTH_LONG).show();
          }
                */ INSIDE HERE SHOULD NOT BE A MISTAKE

                }   catch(Exception e){ //this throws NullPointerException
                    Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

这是错误堆栈跟踪:

07-17 12:41:05.250  32282-32282/com.martins.martin.bestellen E/YOUR_APP_LOG_TAG﹕ I got an error
java.lang.NullPointerException
        at com.martins.martin.bestellen.SecondActivity$2.onTextChanged(SecondActivity.java:278)
        at android.widget.TextView.sendOnTextChanged(TextView.java:8910)
        at android.widget.TextView.setText(TextView.java:4866)
        at android.widget.TextView.setText(TextView.java:4716)
        at android.widget.EditText.setText(EditText.java:109)
        at android.widget.TextView.setText(TextView.java:4691)
        at android.widget.TextView.onRestoreInstanceState(TextView.java:4583)
        at android.view.View.dispatchRestoreInstanceState(View.java:13722)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2849)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2849)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2849)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2849)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2849)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2849)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2849)
        at android.view.View.restoreHierarchyState(View.java:13700)
        at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1952)
        at android.app.Activity.onRestoreInstanceState(Activity.java:983)
        at android.app.Activity.performRestoreInstanceState(Activity.java:955)
        at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1144)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3947)
        at android.app.ActivityThread.access$1000(ActivityThread.java:169)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5476)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
        at dalvik.system.NativeStart.main(Native Method)

希望你能找到问题所在。应该对键盘做点什么(任何缓冲区????)

非常感谢, 马丁

【问题讨论】:

  • 请发布整个堆栈跟踪,并指出该堆栈跟踪中引用了您的源代码中的哪些特定行。
  • 也许在您的 onpause 中您将 edittext textwatcher 设置为 null,您能确认一下吗?
  • 我认为这与设置EditText的ID有关。您正在使用带有一些字符串的setId 设置EditText 的ID,然后在setOnKeyListener 中将视图分配给viewEditText1。因此,当在键盘上按下一个键时,就会发生这种情况。然后在onTextChanged 中,您将id1 分配给viewEditText1 的ID,但是如果从未在键盘上按下某个键,那么viewEditText1 的ID 是什么?空值?这可能与“真正奇怪的是,当键盘打开并且我按任意键然后按 DEL 键时一切正常。”。
  • 谢谢。我无法解决它。但为什么它适用于不同的手机(或安卓系统)?
  • 现在我通过以编程方式模拟 DEL-Keypress 来解决它。这是一个非常糟糕的解决方案,但我找不到问题...

标签: android nullpointerexception textwatcher


【解决方案1】:

现在我通过以编程方式模拟 DEL-Keypress 解决了这个问题。这是一个非常糟糕的解决方案,但我找不到问题...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2011-04-21
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多