在android中定义按钮事件的最佳实践 [英] Best practice for defining button events in android
问题描述
我有一个用 XML 定义的 Layout
,它由几个 Button
组成.
I have a Layout
defined in XML which consists of several Button
s.
目前我在 OnCreate
方法中执行此操作以针对按钮定义事件处理程序:
Currently I am doing this in the OnCreate
method to define the event handlers against the buttons:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button newPicButton = (Button)findViewById(R.id.new_button);
newPicButton.setOnClickListener(btnListener);
..... similarly for other buttons too
.....
}
在 Button
的 onClick
事件内部,我启动了一个相机 Intent
来获取图片,并在 onActivityResult
回调我再次设置事件处理程序以及设置 View
像这样:
Inside of the Button
's onClick
event, I launch a camera Intent
to get a picture and inside the onActivityResult
callback I am again setting the event handlers along with setting the View
like this:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
setContentView(R.layout.main);
Button newPicButton = (Button)findViewById(R.id.new_button);
newPicButton.setOnClickListener(btnListener);
...similarly for other buttons too
}
我是 android 的新手,这种每次重新定义事件的方法对我来说似乎很脏.我想知道在这样的场景中定义按钮事件处理程序的最佳实践是什么.
I am new to android and this approach of redefining an event every time seems quite dirty to me. I would like to know what is the best practice in terms of defining button event handlers in scenarios like this.
粘贴我的完整课程
public class CameraAppActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button newPicButton = (Button)findViewById(R.id.new_button);
newPicButton.setOnClickListener(btnListener);
}
//---create an anonymous class to act as a button click listener---
private OnClickListener btnListener = new OnClickListener()
{
public void onClick(View v)
{
//Intent newPicIntent = new Intent(v.getContext(), NewPictureActivity.class);
//startActivityForResult(newPicIntent, 0);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 999);
}
};
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
setContentView(R.layout.main);
Button newPicButton = (Button)findViewById(R.id.new_button);
newPicButton.setOnClickListener(btnListener);
//if I comment last two lines nothing happens when I click on button
}
主要问题是
setContentView(R.layout.main);
Button newPicButton = (Button)findViewById(R.id.new_button);
newPicButton.setOnClickListener(btnListener);
在 onActivityResult
中重新注册事件......这是正确的方法吗?还是我做错了什么?因为如果我不重新注册事件,当我点击按钮时什么也不会发生.
Re-registering events inside onActivityResult
.. is it right approach? Or am I doing something wrong? Because If I don't re-register event nothing happens when I click the button.
推荐答案
为什么不在 XML 布局中注册 onClick 事件,然后在代码中处理.这就是我要做的:
Why not registering onClick event in the XML layout and then handle it in the code. This is how I would do it:
<Button
android:id="@+id/my_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me"
android:onClick="onBtnClicked">
</Button>
现在创建一个处理点击的方法
and now create a method that would handle clicks
public void onBtnClicked(View v){
if(v.getId() == R.id.my_btn){
//handle the click here
}
}
或者,您可以为代码中的每个项目单独设置 OnClickListener.然后使用 if/else 或 switch 语句来确定原点.
Alternatively, you can set the OnClickListener individually for each item in the code. Then use the if/else or switch statements to determine the origin.
通过这种方式,您可以使用一种方法来处理一种布局中的所有按钮.
This way you can have one method that handles all buttons from one layout.
更新:
虽然这是一种有效的方法,但我强烈推荐第二种选择.它更干净、更易于维护,尤其是在您使用片段时.
这篇关于在android中定义按钮事件的最佳实践的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!