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

时间:2011-09-11 23:32:45

标签: java android

我是android的新手,我可能在2年内没有做任何Java编程。

我正在关注android开发者资源的教程。 更具体地说http://developer.android.com/resources/tutorials/views/hello-formstuff.html 使用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对象不是最终的真正重要吗?

我的按钮是最终的,它的监听器在其他地方声明并且android很高兴,我想因为我没有改变按钮或获得按钮的任何属性。就像我保持EditText最终一样,我的监听器代码无法解析edittext(EditText对象)。

我可以继续这样做吗?还是有另一种方法(除了在onCreate方法中声明一切之外)。

1 个答案:

答案 0 :(得分:1)

他们使EditText成为最终版本,以便引用无法更改,因为您无法将其重新分配给其他值。通过将其作为实例变量,可以在

中的onKey期间更改对EditText的引用
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”,而不是EditText中的内容 在布局中

或者,您可以从onKey下面的View v参数中获取正在设置收听者的视图的正确引用

public abstract boolean onKey (View v, int keyCode, KeyEvent event)

下面是修改侦听器代码以从OnTeeyListener正在侦听的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;
    }
}; 

请注意,尽管引用更改的风险很小,但将View作为实例变量放置并不是一种罕见的做法。我见过的许多代码只会像您一样通过onCreate分配View一次,从而降低了引用重新分配的风险。