Android 如何在编辑文本侦听器的beforeTextChanged方法中设置变量,然后在该方法之外调用该变量?

Android 如何在编辑文本侦听器的beforeTextChanged方法中设置变量,然后在该方法之外调用该变量?,android,android-edittext,listener,Android,Android Edittext,Listener,我试图得到一个“previous”按钮,这意味着在用户输入文本框之前,一个变量被分配给编辑文本已经是的内容。现在我正在尝试获取它,以便在文本更改侦听器后,可以按下按钮返回到文本框中的前一个单词。但当我这么做的时候,我得到的信息是:符号无法解析。这是因为按钮的onclick侦听器是一个单独的方法。如何共享此变量 editText.addTextChangedListener(new TextWatcher() { @Override public void befo

我试图得到一个“previous”按钮,这意味着在用户输入文本框之前,一个变量被分配给编辑文本已经是的内容。现在我正在尝试获取它,以便在文本更改侦听器后,可以按下按钮返回到文本框中的前一个单词。但当我这么做的时候,我得到的信息是:符号无法解析。这是因为按钮的onclick侦听器是一个单独的方法。如何共享此变量

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            final String previousWord = editText.getText().toString();


        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
        }

    });


    btnPrevious.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            view.startAnimation(animScale);


            editText.setText(previousWord);

        }
    });

您可以在侦听器之外声明previousWord变量

这将允许您访问两个侦听器中的变量

大概是这样的:

private String previousWord;

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
        previousWord = editText.getText().toString();


    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
    }

});


btnPrevious.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        view.startAnimation(animScale);


        editText.setText(previousWord);

    }
});
final MyWatcher watcher = new MyWatcher(editText);
editText.addTextChangedListener(watcher);
btnPrevious.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        view.startAnimation(animScale);
        watcher.rollback();
    }
});

首先在代码中的某个地方定义此类:

class MyWatcher implements TextWatcher {
    private String mPrev;
    private EditText mEditText;

    public MyWatcher(EditText editText){
        mEditText = editText;
    }

    public void rollback(){
        mEditText.setText(mPrev);
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
        mPrev = mEditText.getText().toString();
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
    }
}
像这样使用它:

private String previousWord;

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
        previousWord = editText.getText().toString();


    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
    }

});


btnPrevious.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        view.startAnimation(animScale);


        editText.setText(previousWord);

    }
});
final MyWatcher watcher = new MyWatcher(editText);
editText.addTextChangedListener(watcher);
btnPrevious.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        view.startAnimation(animScale);
        watcher.rollback();
    }
});

另一个解决方案可能是@jasonwarford的答案,但将
previousWord
定义为类成员而非局部变量。

你能发布你试图使用的代码吗?使用editText.addTextChangedListener(此)和btnPrevious.setOnClickListener(此)当我添加此项时,我在private下面得到一条下划线,表示:“此处不允许使用修饰符private”,beforeTextChanged中previousWord下的下划线表示:“变量previous color是从内部类中访问的,需要声明为final”。我将private更新为final,但beforeTextChanged中的下划线改为“无法为最终的前一个单词赋值”@MasonM你听到“Java”这个词了吗?或者这是个奇怪的词@ABFORCE我收到这样一条消息:(对不起,我想我在之前的评论中没有正确键入)“无法为最终变量'previousWord'@MasonM remove
final
word@ABFORCE当我这样做时,beforeTextChanged方法中的previousWord变量会给我“变量‘previousWord’是从内部类中访问的,需要声明为final”当我按btnPrevious时,编辑文本中的文本消失,它不会返回到以前的文本。当我放置最后一个MyWatcher watcher=new MyWatcher();和editText.addChangedListener(watcher)时,它消失进入按钮的onclicklistener。如果我将其放在onclicklistener之外,文本根本不会更改。@MasonM我有一个错误,请尝试更新的答案。它仍然不能正常工作。当我第一次按下它时,它会将编辑文本加载回零,然后在我再次键入编辑文本并按下上一个按钮后,它不会更改ge@MasonM这应该可以,您是要回滚整个单词还是只回滚一个字符?