Android 如何在编辑文本侦听器的beforeTextChanged方法中设置变量,然后在该方法之外调用该变量?
我试图得到一个“previous”按钮,这意味着在用户输入文本框之前,一个变量被分配给编辑文本已经是的内容。现在我正在尝试获取它,以便在文本更改侦听器后,可以按下按钮返回到文本框中的前一个单词。但当我这么做的时候,我得到的信息是:符号无法解析。这是因为按钮的onclick侦听器是一个单独的方法。如何共享此变量Android 如何在编辑文本侦听器的beforeTextChanged方法中设置变量,然后在该方法之外调用该变量?,android,android-edittext,listener,Android,Android Edittext,Listener,我试图得到一个“previous”按钮,这意味着在用户输入文本框之前,一个变量被分配给编辑文本已经是的内容。现在我正在尝试获取它,以便在文本更改侦听器后,可以按下按钮返回到文本框中的前一个单词。但当我这么做的时候,我得到的信息是:符号无法解析。这是因为按钮的onclick侦听器是一个单独的方法。如何共享此变量 editText.addTextChangedListener(new TextWatcher() { @Override public void befo
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 removefinal
word@ABFORCE当我这样做时,beforeTextChanged方法中的previousWord变量会给我“变量‘previousWord’是从内部类中访问的,需要声明为final”当我按btnPrevious时,编辑文本中的文本消失,它不会返回到以前的文本。当我放置最后一个MyWatcher watcher=new MyWatcher();和editText.addChangedListener(watcher)时,它消失进入按钮的onclicklistener。如果我将其放在onclicklistener之外,文本根本不会更改。@MasonM我有一个错误,请尝试更新的答案。它仍然不能正常工作。当我第一次按下它时,它会将编辑文本加载回零,然后在我再次键入编辑文本并按下上一个按钮后,它不会更改ge@MasonM这应该可以,您是要回滚整个单词还是只回滚一个字符?