Java 从OnClickListener访问主类中的对象-这是安全的方法吗?

Java 从OnClickListener访问主类中的对象-这是安全的方法吗?,java,android,Java,Android,我是android新手,大概有近两年没有做过Java编程了 我正在关注android开发者资源的教程。 更具体地说 使用EditText小部件 现在,示例中的代码运行良好(在onCreate方法中创建侦听器) 但是,在玩游戏时,我喜欢在其他地方定义侦听器,因为它将代码分离出来,以便更易于阅读和管理 这是我的课,其他的东西都拿出来了 public class HelloFormStuf extends Activity { private EditText edittext; /** Calle

我是android新手,大概有近两年没有做过Java编程了

我正在关注android开发者资源的教程。 更具体地说 使用EditText小部件

现在,示例中的代码运行良好(在onCreate方法中创建侦听器)

但是,在玩游戏时,我喜欢在其他地方定义侦听器,因为它将代码分离出来,以便更易于阅读和管理

这是我的课,其他的东西都拿出来了

public class HelloFormStuf extends Activity {
private EditText edittext;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(btnOnClickListener);
    edittext = (EditText)findViewById(R.id.edittext);
    edittext.setOnKeyListener(etOnKeyListener);

}
private OnClickListener btnOnClickListener = new OnClickListener() {
    public void onClick(View v) {
        Toast.makeText(HelloFormStuf.this, "Beep Bop", Toast.LENGTH_SHORT).show();
    }
};

private OnKeyListener etOnKeyListener = new OnKeyListener() {

    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // if the event is a key-down event on the enter button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
                (keyCode == KeyEvent.KEYCODE_ENTER)) 
        {
            Toast.makeText(HelloFormStuf.this, edittext.getText() ,Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
}; }
现在,编辑文本的原始教程是最终版本

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // If the event is a key-down event on the "enter" button
    if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
        (keyCode == KeyEvent.KEYCODE_ENTER)) {
      // Perform action on key press
      Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
      return true;
    }
    return false;
}});
我的问题是,与教程相比,这样做安全吗?因为现在的最大区别是EditText对象不再是final,而是在类外部声明,而是在onCreate内部初始化

这安全吗?例如,不会有小怪癖摆在角落里造成错误。使EditText对象不是最终对象真的很重要吗?

我的按钮是最终的,它的监听器在别处声明,安卓很高兴,我猜是因为我没有改变按钮或获取按钮的任何属性。如果我将EditText保留为final,则我的侦听器代码无法解析EditText(EditText对象)


我是否可以继续这样做,或者是否有其他方法(除了在onCreate方法中声明所有内容)。

它们将EditText设置为最终版本,这样引用就不会更改,因为您无法将其重新指定给其他值。通过将其作为实例变量,对EditText的引用可能会在onKey-in期间更改

Toast.makeText(HelloFormStuf.this, edittext.getText() ,Toast.LENGTH_SHORT).show();
return true;
下面是显示引用重新分配的代码:


// get the EditText from the XML
this.editText = (EditText)this.findViewById(R.id.edittext);
this.editText.setOnKeyListener(etOnKeyListener);

// Create a new EditText
EditText modifiedText = new EditText(this);
modifiedText.setText("Foo Bar");

// reassign the reference to modified text
this.editText = modifiedText;
现在,当你按下这个键时,你会在你的吐司中看到“Foo Bar”,而不是文本中的内容 在布局中

或者,您可以从下面的
View v
参数中获得要设置侦听器的视图的正确引用

下面是对侦听器代码的修改,以从OnKeyListener正在侦听的EditText中获取文本


private OnKeyListener etOnKeyListener = new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // if the event is a key-down event on the enter button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
                (keyCode == KeyEvent.KEYCODE_ENTER)) 
        {
            // get the EditText that this listener is set on
            EditText editTextWithListener = (EditText)v;

            // now you will get the text from the EditText where you are listening to even if you
            // change the reference as above
            Toast.makeText(WebViewMain.this, editTextWithListener.getText() ,Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
}; 

请注意,尽管发生引用更改的风险很小,但将视图作为实例变量并不少见。我见过的许多代码只通过
onCreate
分配视图一次,就像您那样,从而降低了引用重新分配的风险

它们将EditText设置为final,这样引用就不会更改,因为您无法将其重新分配给其他值。通过将其作为实例变量,对EditText的引用可能会在onKey-in期间更改

Toast.makeText(HelloFormStuf.this, edittext.getText() ,Toast.LENGTH_SHORT).show();
return true;
下面是显示引用重新分配的代码:


// get the EditText from the XML
this.editText = (EditText)this.findViewById(R.id.edittext);
this.editText.setOnKeyListener(etOnKeyListener);

// Create a new EditText
EditText modifiedText = new EditText(this);
modifiedText.setText("Foo Bar");

// reassign the reference to modified text
this.editText = modifiedText;
现在,当你按下这个键时,你会在你的吐司中看到“Foo Bar”,而不是文本中的内容 在布局中

或者,您可以从下面的
View v
参数中获得要设置侦听器的视图的正确引用

下面是对侦听器代码的修改,以从OnKeyListener正在侦听的EditText中获取文本


private OnKeyListener etOnKeyListener = new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // if the event is a key-down event on the enter button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) && 
                (keyCode == KeyEvent.KEYCODE_ENTER)) 
        {
            // get the EditText that this listener is set on
            EditText editTextWithListener = (EditText)v;

            // now you will get the text from the EditText where you are listening to even if you
            // change the reference as above
            Toast.makeText(WebViewMain.this, editTextWithListener.getText() ,Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
}; 

请注意,尽管发生引用更改的风险很小,但将视图作为实例变量并不少见。我见过的许多代码只通过
onCreate
分配视图一次,就像您那样,从而降低了引用重新分配的风险

谢谢,它现在开始变得更有意义了。谢谢,它现在开始变得更有意义了。