有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有2个EditText字段的java文本更改侦听器

在我的项目中,我有两个带有文本更改侦听器的EditText字段

    final EditText Field1 = (EditText) findViewById(R.id.Field1);
    final EditText Field2 = (EditText) findViewById(R.id.Field2);

    Field1.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(Field1.getText().toString().equals("")){

            }
            else{
                double number1 = Double.valueOf(Field1.getText().toString());
                double number2 = Math.round((number1 * 10) / 25);
                Field2.setText(String.valueOf(number2));
            }
        }
    });

    Field2.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(Field2.getText().toString().equals("")){

            }
            else{

            }

        }
    });

当我在字段1中输入一个数字时,它在字段2中出现,这很好。但是当我把这个代码放在Field2中时:

            if(Field2.getText().toString().equals("")){

            }
            else{
                double number2 = Double.valueOf(Field2.getText().toString());
                double number1 = Math.round((number2 * 20) / 35);
                Field1.setText(String.valueOf(number1));
            }

我在Field2中输入了一个数字,应用程序崩溃了。 堆栈跟踪:

31972-31972/arkstudioapps.textchangelistener E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: arkstudioapps.textchangelistener, PID: 31972
java.lang.StackOverflowError
        at 安卓.text.MeasuredText.addStyleRun(MeasuredText.java:164)
        at 安卓.text.MeasuredText.addStyleRun(MeasuredText.java:204)
        at 安卓.text.StaticLayout.generate(StaticLayout.java:281)
        at 安卓.text.DynamicLayout.reflow(DynamicLayout.java:284)
        at 安卓.text.DynamicLayout.<init>(DynamicLayout.java:170)
        at 安卓.widget.TextView.makeSingleLayout(TextView.java:6134)
        at 安卓.widget.TextView.makeNewLayout(TextView.java:6032)
        at 安卓.widget.TextView.checkForRelayout(TextView.java:6571)
        at 安卓.widget.TextView.setText(TextView.java:3813)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$2.onTextChanged(MainActivity.java:62)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at 安卓.widget.TextView.setText(TextView.java:3671)
        at 安卓.widget.EditText.setText(EditText.java:80)
        at 安卓.widget.TextView.setText(TextView.java:3646)
        at arkstudioapps.textchangelistener.MainActivity$1.onTextChanged(MainActivity.java:38)
        at 安卓.widget.TextView.sendOnTextChanged(TextView.java:7408)
        at 安卓.widget.TextView.setText(TextView.java:3816)
        at an

我怎样才能解决这个问题

提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    final EditText Field1 = (EditText) findViewById(R.id.Field1);
    final EditText Field2 = (EditText) findViewById(R.id.Field2);
    
    Field1.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 (getCurrentFocus() == Field1)
    {
            if(Field1.getText().toString().equals("")){
    
            }
            else{
                double number1 = Double.valueOf(Field1.getText().toString());
                double number2 = Math.round((number1 * 10) / 25);
                Field2.setText(String.valueOf(number2));
            }
        }
    }
    });
    
    Field2.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 (getCurrentFocus() == Field2)
        {
            if(Field2.getText().toString().equals("")){
    
            }
            else{
    
                double number2 = Double.valueOf(Field2.getText().toString());
                double number1 = Math.round((number2 * 20) / 35);
                Field1.setText(String.valueOf(number1));
    
            }
    
        }
      }
    });
    

    试试这个,也许对你有帮助

  2. # 2 楼答案

    一,

    当您试图在两个EditText上都使用TextWatcher时,在ContextChanged或其他TextWatcher方法中更改文本通常不是一个好主意您必须避免由于在EditText中更改文本而进入无限循环

    如果只需要对另一个字段执行一次性计算和文本更新,则在键入一个字段时,请尝试以下操作:

    在您的活动中,定义一个布尔变量,该变量将控制在TextWather方法中调用setText,并防止我们进入无限循环:

    private boolean keepChangingText = true;
    

    然后更新您的TextWatchers,如下所示:

    Field1.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 (Field1.getText().toString().equals("")) {
    
            }
            else {
                double number1 = Double.valueOf(Field1.getText().toString());
                double number2 = Math.round((number1 * 10) / 25);
                if (keepChangingText) {
                    keepChangingText = false;
                    Field2.setText(String.valueOf(number2));
                } else {
                    keepChangingText = true;
                }
            }
        }
    });
    
    Field2.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 (Field2.getText().toString().equals("")) {
    
            }
            else {
                double number2 = Double.valueOf(Field2.getText().toString());
                double number1 = Math.round((number2 * 20) / 35);
                if (keepChangingText) {
                    keepChangingText = false;
                    Field1.setText(String.valueOf(number1));
                } else {
                    keepChangingText = true;
                }
    
            }
        }
    });
    

    二,

    Double.valueOf(Field1.getText().toString());
    

    如果键入一些无效文本,则可能会失败

  3. # 3 楼答案

    尝试使用此代码这是EditText上的setontouchListener简单代码

    EditText edtName,edtAddress;
    TextView tvaData;
    editTextName.setOnTouchListener(new OnTouchListener() {         
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                ChangeText(); 
                return false;
            }
        }); 
       edtAddress.setOnTouchListener(new OnTouchListener() {
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                ChangeText(); 
                return false;
            }
        }); 
    private void ChangeText{ 
    tvaData.setText("Abc");
    }