【问题标题】:Android Studio: Adding two numbers wihout a buttonAndroid Studio:在没有按钮的情况下添加两个数字
【发布时间】:2020-05-26 16:37:43
【问题描述】:

我正在使用 Android Studio 开发一个添加两个数字的程序。首先,我使用了一个按钮来开始计算,但现在我不想再使用那个按钮了,所以我正在寻找一种实时添加两个数字的可能性。如果我更改一个数字,结果应该会立即出现。你有什么建议吗? 这是我的按钮变体代码:

新代码:

 public class MainActivity extends AppCompatActivity {
    EditText firstNumEditText, secondNumEditText;
    TextView resultTextView;

    class MyTextWatcher implements 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) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            String second = secondNumEditText.getText().toString().trim();
            String first = firstNumEditText.getText().toString().trim();
            int num1 = Integer.parseInt(second);
            int num2 = Integer.parseInt(first);
            int result = num1 + num2;
            resultTextView.setText(result + "");
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firstNumEditText = (EditText) findViewById(R.id.firstNumEditText);
        firstNumEditText.addTextChangedListener(new MyTextWatcher());
        secondNumEditText = (EditText) findViewById(R.id.secondNumEditText);
        secondNumEditText.addTextChangedListener(new MyTextWatcher());
        resultTextView = (TextView) findViewById(R.id.resultTextView);
    }
}

LogCat 的输出:

 java.lang.NumberFormatException: For input string: ""
        at java.lang.Integer.parseInt(Integer.java:533)
        at java.lang.Integer.parseInt(Integer.java:556)
        at com.example.aufgabe2.MainActivity$MyTextWatcher.afterTextChanged(MainActivity.java:33)
        at android.widget.TextView.sendAfterTextChanged(TextView.java:8202)
        at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10381)
        at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1218)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:579)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:509)
        at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:508)
        at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
        at android.widget.TextView.doKeyDown(TextView.java:6284)
        at android.widget.TextView.onKeyDown(TextView.java:6074)
        at android.view.KeyEvent.dispatch(KeyEvent.java:2676)
        at android.view.View.dispatchKeyEvent(View.java:9880)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1667)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1667)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1667)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1667)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1667)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1667)
        at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:403)
        at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1800)
        at androidx.core.view.KeyEventDispatcher.activitySuperDispatchKeyEventPre28(KeyEventDispatcher.java:130)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:87)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:126)
        at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:535)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:2533)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:317)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4327)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4298)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145)
        at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3647)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

【问题讨论】:

标签: java android android-studio calculation


【解决方案1】:

TextWatcher 可以帮助您从 EditTexts 中动态获取价值:

  • 我添加了一个内部类来实现 TextWatcher
  • 将一个对象从该内部类传递给editText.addOnTextChangedListener
  • 我使用afterTextChanged() 从 EditText 获取结果并执行我的操作。
public class MainActivity extends AppCompatActivity {

    private EditText firstNumEditText, secondNumEditText;
    private TextView resultTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        firstNumEditText= findViewById(R.id.firstNumEditText);
        firstNumEditText.addTextChangedListener(new MyTextWatcher());
        secondNumEditText=(EditText) findViewById(R.id.secondNumEditText);
        secondNumEditText.addTextChangedListener(new MyTextWatcher());
        resultTextView=(TextView) findViewById(R.id.resultTextView);
        ...
    }

    class MyTextWatcher implements 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) { }
        @Override
        public void afterTextChanged(Editable s) {
            String second = secondNumEditText.getText().toString().trim();
            String first = firstNumEditText.getText().toString().trim();
            if (!second.isEmpty() && !first.isEmpty()) {
                try {
                    int firstNumber = Integer.parseInt(first);
                    int secondNumber = Integer.parseInt(second);
                    //Do calculation
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

【讨论】:

  • 谢谢,我试试看!
  • 我不知道为什么,但现在程序没有启动。没有错误,但模拟的手机说应用程序一直在停止。我将新代码添加到问题中。如果我犯了转储错误,我很抱歉,但我是 Android 新手 :)
  • @bfg 没关系,我的朋友。只是不要在onCreate 打电话之前findViewById。另外,你是setConteView(R.layout.activity_main) 两次,删除其中一个。我编辑了我的答案。
  • 我更新了代码。现在应用程序启动,但只要我想输入一个数字,应用程序就会停止。 Android Studio 没有提及错误
  • @bfg 请提供您在 Android Studio 中来自 LogCat 的错误日志,以便我为您提供帮助。
【解决方案2】:

您可以在EditText 上使用TextWatcher 来监听文本更改事件并执行加或减之类的操作。

【讨论】:

    【解决方案3】:

    您可以通过将addTextChangedListener 添加到editText 来实现。

    editText.addTextChangeListener(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) {
                 // here you can extract the value from edit text and do the addition
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                }
            }); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2012-07-09
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多