java - 将文本设置为 switch 语句内的编辑文本时出错

标签 java android switch-statement

我正在尝试使用 settext 作为编辑文本。我有这段代码是因为我需要在多个编辑文本中使用 afterTextChanged() 。如果我在案例中使用 setText:应用程序崩溃,但在按钮的 onClick 外部可以正常工作。

    public Button btn;
    public EditText et1, et2, et3;
    private int whoHasFocus = 0;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.testing2, container, false);

        super.onCreate(savedInstanceState);

        et1 = (EditText) view.findViewById(R.id.ladoA);
        et1.setOnFocusChangeListener(this);
        et1.addTextChangedListener(this);
        et2 = (EditText) view.findViewById(R.id.ladoB);
        et2.setOnFocusChangeListener(this);
        et2.addTextChangedListener(this);
        et3 = (EditText) view.findViewById(R.id.ladoC);
        et3.setOnFocusChangeListener(this);
        et3.addTextChangedListener(this);

        btn = (Button) view.findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                et1.setText("Works correctly.");
            }
        });

        return view;
    }

    @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) {
        switch (whoHasFocus) {
            case 1:
                et2.setText("It does not work.");
                break;
            case 2:

                break;
            case 3:

                break;
        }
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        switch (v.getId()) {
            case R.id.ladoA:
                whoHasFocus = 1;
                break;
            case R.id.ladoB:
                whoHasFocus = 2;
                break;
            case R.id.ladoC:
                whoHasFocus = 3;
                break;
        }
    }


}

这是日志:

10-01 11:47:19.202    4141-4141/example.test.com.testApp D/OpenGLRenderer﹕ Enabling debug mode 0
10-01 11:47:21.855    4141-4141/example.test.com.testApp D/dalvikvm﹕ GC_FOR_ALLOC freed 234K, 35% free 11382K/17256K, paused 26ms, total 26ms
10-01 11:47:21.885    4141-4141/example.test.com.testApp I/dalvikvm-heap﹕ Grow heap (frag case) to 20.760MB for 6998416-byte allocation
10-01 11:47:21.935    4141-4143/example.test.com.testApp D/dalvikvm﹕ GC_CONCURRENT freed 8K, 25% free 18209K/24092K, paused 2ms+2ms, total 40ms
10-01 11:47:21.935    4141-4141/example.test.com.testApp I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawable
10-01 11:47:21.935    4141-4141/example.test.com.testApp W/dalvikvm﹕ VFY: unable to resolve virtual method 371: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
10-01 11:47:21.935    4141-4141/example.test.com.testApp D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
10-01 11:47:21.935    4141-4141/example.test.com.testApp I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawableForDensity
10-01 11:47:21.935    4141-4141/example.test.com.testApp W/dalvikvm﹕ VFY: unable to resolve virtual method 373: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
10-01 11:47:21.935    4141-4141/example.test.com.testApp D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
10-01 11:47:28.252    4141-4141/example.test.com.testApp I/dalvikvm﹕ threadid=1: stack overflow on call to Landroid/view/View;.invalidate:VZ
10-01 11:47:28.252    4141-4141/example.test.com.testApp I/dalvikvm﹕ method requires 40+20+20=80 bytes, fp is 0x57102338 (56 left)
10-01 11:47:28.252    4141-4141/example.test.com.testApp I/dalvikvm﹕ expanding stack end (0x57102300 to 0x57102000)
10-01 11:47:28.252    4141-4141/example.test.com.testApp I/dalvikvm﹕ Shrank stack (to 0x57102300, curFrame is 0x57107d20)
10-01 11:47:28.252    4141-4141/example.test.com.testApp D/AndroidRuntime﹕ Shutting down VM
10-01 11:47:28.252    4141-4141/example.test.com.testApp W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40e37ac8)
10-01 11:47:28.342    4141-4141/example.test.com.testApp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.StackOverflowError
            at android.view.View.invalidate(View.java:10849)
            at android.widget.TextView.invalidateRegion(TextView.java:4975)
            at android.widget.TextView.invalidateCursor(TextView.java:4966)
            at android.widget.TextView.spanChange(TextView.java:8060)
            at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:10023)
            at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979)
            at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:688)
            at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
            at android.text.Selection.setSelection(Selection.java:116)
            at android.text.Selection.setSelection(Selection.java:127)
            at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
            at android.widget.TextView.setText(TextView.java:4092)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp.Testing2.afterTextChanged(Testing2.java:62)
            at android.widget.TextView.sendAfterTextChanged(TextView.java:7982)
            at android.widget.TextView.setText(TextView.java:4111)
            at android.widget.TextView.setText(TextView.java:3924)
            at android.widget.EditText.setText(EditText.java:104)
            at android.widget.TextView.setText(TextView.java:3899)
            at example.test.com.testApp

最佳答案

您在 afterTextChanged 中设置 EditText 的文本,它会再次调用 afterTextChanged。此递归调用会创建无限循环,从而导致堆栈溢出。

关于java - 将文本设置为 switch 语句内的编辑文本时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32956886/

相关文章:

java - 在 Java 中打开大型数据集和实例化数据时遇到问题

java - Firebase:引用节点上的OrderbyChild,在onDataChange中返回NULL快照

java - 尝试访问自定义 AlertDialog 的子级会导致 NullPointerException

java - 如何强制关闭另一个应用程序

java - 在弹出窗口中切换 NullPointerException

java - 跳出循环

java - Spring 集成: Returning stream

java - 为什么 GWT 应用程序不显示?

android - fragment 的 dispatchTouchEvent 等价物是什么?

Linux如何使用rm和exclude开关