【问题标题】:I am unable to change text in EditText1 in response to the text change in EditText2我无法更改 EditText1 中的文本以响应 EditText2 中的文本更改
【发布时间】:2015-03-23 15:11:41
【问题描述】:

我希望用户输入摄氏温度并显示华氏温度,反之亦然。我认为 TextChangedListener 非常适合在不按下任何按钮的情况下进行转换。随着用户输入,这些值会不断变化。

我遇到的最大问题是 EditText 不会接受任何输入。我输入任何内容的那一刻,应用程序强制关闭。请告诉我出了什么问题。这是我的代码。

public class MainActivity extends ActionBarActivity {

EditText C, F;
Button exit;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    C = (EditText) findViewById(R.id.celsius);
    F = (EditText) findViewById(R.id.fahrenheit);
    exit = (Button) findViewById(R.id.exit);

    C.addTextChangedListener(new TextWatcher() {
        float f,c;

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

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            c = Float.parseFloat(s.toString());
            f = (((9 / 5) * c) + 32);
            F.setText((int) f);
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    F.addTextChangedListener(new TextWatcher() {
        float f
                ,
                c;

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

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            f = Float.parseFloat(s.toString());
            c = ((f - 32) * (5 / 9));
            C.setText((int) c);
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

}

}

这是我的 Logcat。

01-25 00:55:35.486    7051-7051/com.jainchiranjeev.mylearning7.mylearning_7 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.jainchiranjeev.mylearning7.mylearning_7, PID: 7051
java.lang.StackOverflowError
        at android.text.SpannableStringBuilder.getChars(SpannableStringBuilder.java:915)
        at android.text.TextUtils.getChars(TextUtils.java:81)
        at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
        at android.text.TextUtils.getChars(TextUtils.java:81)
        at android.text.TextUtils.indexOf(TextUtils.java:114)
        at android.text.StaticLayout.generate(StaticLayout.java:187)
        at android.text.DynamicLayout.reflow(DynamicLayout.java:288)
        at android.text.DynamicLayout.<init>(DynamicLayout.java:174)
        at android.widget.TextView.makeSingleLayout(TextView.java:6205)
        at android.widget.TextView.makeNewLayout(TextView.java:6103)
        at android.widget.TextView.checkForRelayout(TextView.java:6752)
        at android.widget.TextView.setText(TextView.java:3850)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(

【问题讨论】:

  • "app force closes" 可能意味着错误,所以错误 logcat 会很好调试
  • 请发布您的 logcat。
  • 我认为有 2 个地方可能会出现错误 #1。 f = Float.parseFloat(s.toString()); #2。 C.setText((int) c);对于前者,请确保仅以字符串形式给出数字以进行调试提供明确的值,例如 f = Float.parseFloat("35");第二个不使用 (int) 强制转换 afaik edittext 只接受文本和字符串,而不是用于调试,只需像这样打印“值是:”+c(这是用于调试)
  • TextView 工作得很好,正如一些善良的人指出的那样。但是你知道我可以在 EditText 中实现它的方法吗?我实际上正在开发一个数字转换器应用程序(二进制、八进制、十六进制和十进制)。我里面有多个 EditTexts。我希望用户输入任何数字并获取其他数字。希望你能理解我的问题。

标签: android android-edittext converter forceclose textchanged


【解决方案1】:

我会实现两个TextViews 来显示每个计算的结果。您现在正在做的是创建一个无限循环,当更改第一个 EditText 中的文本时触发您的第二个编辑文本 onTextChanged 侦听器,依此类推。因此出现 stackoverflow 错误。

更改您的实现以在TextView 中显示每个EditText 计算,那么问题就会消失。

简而言之,添加您的TextView

TextView tv = (TextView)findViewById(R.id.textview);

在你的

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    c = Float.parseFloat(s.toString());
    f = (((9 / 5) * c) + 32);
    tv .setText(String.valueOf(f));
}

【讨论】:

  • 问题依然存在。我根本无法输入任何文字。转换单位是后来的事情。如果有帮助,我已经发布了我的 logcat。
  • @ChiranjeevJain。啊,我没有看到你代码的最后一部分。这只是一个逻辑问题。您有两个带有 onTextChange 侦听器的 EditText。如果您在第一个中编辑文本,则在第二个中添加文本。但是然后你告诉第二个在第一个中更改你的文本。这将是一个无限循环,因此会出现 stackoverflow 错误。你需要检查你的逻辑。
  • 效果很好。谢谢您的帮助。但是你知道我可以在 EditText 中实现它的方法吗?我实际上正在开发一个数字转换器应用程序(二进制、八进制、十六进制和十进制)。我里面有多个 EditTexts。我希望用户输入任何数字并获取其他数字。希望你能理解我的问题。
  • @Chiranjeev Jain 你应该为此创建一个单独的问题。如果此答案解决了您当前的问题,请勾选是否为答案:-)
【解决方案2】:

试试那个代码

我刚刚研究了文档,它说

onTextChanged() 不是修改EditText文本的地方

这里是您可以从那里验证的文档的链接

http://developer.android.com/reference/android/text/TextWatcher.html#onTextChanged%28java.lang.CharSequence,%20int,%20int,%20int%29

所以你可以做的就是将代码移动到文本更改后。

C.addTextChangedListener(new TextWatcher() {
    float f
            ,
            c;

    @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) {
        if (!isAlpha(s.toString)){

            if(!s.toString().equals("")){

                c = Float.parseFloat(s.toString());
                f = (((9 / 5) * c) + 32);
                F.setText(""+ f);
             }
        }
    }
});

this isAlpha 函数是检查用户输入的是数字值还是字母值

 public boolean isAlpha(String name) {
    return name.matches("[a-zA-Z]+");
}

【讨论】:

  • 问题依然存在。我根本无法输入任何文字。转换单位是后来的事情。如果有帮助,我已经发布了我的 logcat。
  • @ChiranjeevJain 我已经更新了答案阅读文档并更改了代码,如果它在这两种情况下都有效或无效。谢谢。
  • 效果很好。谢谢您的帮助。但是你知道我可以在 EditText 中实现它的方法吗?我实际上正在开发一个数字转换器应用程序(二进制、八进制、十六进制和十进制)。我里面有多个 EditTexts。我希望用户输入任何数字并获取其他数字。希望你能理解我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2017-04-18
相关资源
最近更新 更多