我是Android开发的新手,并且还没有在java中编写GUI,所以按钮工作对我来说都是新手。
我正在创建一个简单的hello world应用程序,有一些按钮/无线电/复选框等等。我们必须想办法让它变得更好,简介中没有任何具体内容。所以我想我会得到一些按钮并显示不同种类的烤面包,也许会改变背景等。
所以我根据教程实现了一个toast,但它适用于所有实例化的按钮,而不仅仅是我想要的按钮。我希望另一个按钮可以做其他事情。
我认为它与onClickListener有关,但除此之外,我被卡住了。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(this);
btn2 = (Button) findViewById(R.id.button2);
btn2.setOnClickListener(this);
cb=(CheckBox)findViewById(R.id.check);
cb.setOnCheckedChangeListener(this);
browser=(WebView)findViewById(R.id.webkit);
browser.loadUrl("http://www.google.com/search");
}
public void onClick(View v) {
new AlertDialog.Builder(this).setTitle("MessageDemo").setMessage(
"This is an Alert Dialogue Toast").setNeutralButton(
"Here, here!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dlg, int sumthin) {
Toast.makeText(HelloWorldActivity.this,
"<clink, clink>", Toast.LENGTH_SHORT).show();
}
}).show();
}
这里是按钮的xml
<Button android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Testa"
android:layout_weight="0.2"></Button>
答案 0 :(得分:4)
您已为每个按钮添加了相同的onClickListener,因此它们将具有相同的行为。您实际上可以在setOnClickListener调用中创建侦听器,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
new AlertDialog.Builder(this).setTitle("MessageDemo").setMessage(
"This is an Alert Dialogue Toast").setNeutralButton(
"Here, here!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dlg, int sumthin) {
Toast.makeText(HelloWorldActivity.this,
"<clink, clink>", Toast.LENGTH_SHORT).show();
}
}).show();
}
});
btn2 = (Button) findViewById(R.id.button2);
btn2.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
// Do something different here.
}
});
// The rest of onCreate
}
编辑:我已经更新了答案,以明确原始代码的哪些部分会放在哪里,但我通常不会在onClick
内部粘贴大量代码,因为它不是很可读。我更喜欢这样的东西:
public void onCreate(Bundle savedInstanceState) {
// other onCreate code
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener( new OnClickListener() {
public void onClick(View v) {
showBtn1ClickedDialog();
}
});
// other onCreate code
}
private void showBtn1ClickedDialog() {
new AlertDialog.Builder(this).setTitle("MessageDemo").setMessage(
"This is an Alert Dialogue Toast").setNeutralButton(
"Here, here!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dlg, int sumthin) {
Toast.makeText(HelloWorldActivity.this,"<clink, clink>", Toast.LENGTH_SHORT).show();
}
}).show();
}
答案 1 :(得分:3)
除了goto10的解决方案之外,如果你不想在线定义监听器,你现有的点击处理程序可以检查视图的ID:
public void onClick(View view) {
switch (view.getId()) {
case R.id.about_button:
// handle about
break;
// etc.
我倾向于使用goto10的解决方案,甚至是内部类,而不是像这样的switch语句,但它是另一种选择。那就是说,我正在表达他/她的答案,而不是我的答案。
使用switch
而不是内部类的一个原因是内存使用,尽管使用现代设备,这可能不是一个大问题 - 但每个内部类确实占用更多空间,如果处理程序很小,IMO以这种方式更有效率。
答案 2 :(得分:1)
单击任何按钮会生成一个由onClick eventListener捕获的事件。但它不会自动区分哪个事件产生了事件。这些信息包含在 View v 中,并且通过在视图中使用切换案例,我们可以为不同的点击设置单独的事件。
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn1:
//Do something here
break;
case R.id.btn2:
//Do something else here
break;
case R.id.btn3:
break;
}
}
summary如何在应用程序中使用监听器。