我是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方法中声明一切之外)。
答案 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一次,从而降低了引用重新分配的风险。