ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 由SeekBar和EditText互相改变引起的Stackoverflow错误

2019-07-17 18:33:00  阅读:175  来源: 互联网

标签:android android-edittext stack-overflow seekbar


所以我有一个SeekBar与输入类型编号的EditText一起设置.

我希望它是这样的,如果用户输入一个可行范围内的数字,它将改变SeekBar的进度.此外;如果用户决定通过拖动SeekBar来改变它们;而是将EditText更改为SeekBar的当前值.

我收到一个试图实现这个的stackoverflow,我相信这是因为我们都使用他们的onChanged监听器.所以他们正在对彼此造成无限的变化.

如果是这样的话;如何解释,我将如何实现我想要的结果?

码:

s1.setOnSeekArcChangeListener(new SeekArc.OnSeekArcChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekArc seekArc) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStartTrackingTouch(SeekArc seekArc) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProgressChanged(SeekArc seekArc, int progress,
                boolean fromUser) {
                            if(progress != Integer.parseInt(et1.getText().toString()))
            et1.setText(String.valueOf(progress));
            // TODO Auto-generated method stub

        }
    });

et1.addTextChangedListener(new TextWatcher(){

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            int i = Integer.parseInt(s.toString());
            if(i != Integer.parseInt(et1.getText().toString()))
            s1.setProgress(i);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1,
                int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub
        }

    });

logcat的:

    03-18 14:38:59.104: E/AndroidRuntime(2894): FATAL EXCEPTION: main
03-18 14:38:59.104: E/AndroidRuntime(2894): java.lang.StackOverflowError
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.text.DynamicLayout.reflow(DynamicLayout.java:284)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.text.DynamicLayout.<init>(DynamicLayout.java:170)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.makeSingleLayout(TextView.java:5867)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.makeNewLayout(TextView.java:5765)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.checkForRelayout(TextView.java:6304)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3567)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.EditText.setText(EditText.java:80)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3400)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7119)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3574)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.EditText.setText(EditText.java:80)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3400)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7119)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3574)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.EditText.setText(EditText.java:80)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3400)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7119)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3574)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.EditText.setText(EditText.java:80)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3400)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7119)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3574)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.EditText.setText(EditText.java:80)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3400)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7119)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3574)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.EditText.setText(EditText.java:80)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3400)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$1.onProgressChanged(HomeFragment.java:61)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.updateProgress(SeekArc.java:425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.triggertrap.seekarc.SeekArc.setProgress(SeekArc.java:454)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at com.nanospark.upcdemo.HomeFragment$5.afterTextChanged(HomeFragment.java:116)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.sendAfterTextChanged(TextView.java:7119)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3574)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.TextView.setText(TextView.java:3425)
03-18 14:38:59.104: E/AndroidRuntime(2894):     at android.widget.EditText.setText(EditText.java:80

解决方法:

在onProgressChanged(SeekArc seekArc,int progress,boolean fromUser)中有一个fromUser变量.如果用户不是擦洗SeekBar / Arc的用户,则不要在EditText上设置文本(文本已经被认为是正确的,因为它启动了事件链……)

在你的听众中:

@Override
public void onProgressChanged(SeekArc seekArc, int progress, boolean fromUser) {
    if(fromUser && progress != Integer.parseInt(et1.getText().toString())) {
        et1.setText(String.valueOf(progress));
    }
}

标签:android,android-edittext,stack-overflow,seekbar
来源: https://codeday.me/bug/20190717/1491262.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有