1

我找到了一段用于制作 toast 消息的代码。作为一个新的 android 开发人员,我知道,我们有一个监听器来让按钮工作。但是这里没有听众。那么为什么这段代码有效呢?

 public class MainActivity extends Activity {
private String mButtonMessageTemplate;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mButtonMessageTemplate=getString(R.string.button_messege_template);
}
public void showButtonText(View clickedButton){
Button button=(Button) clickedButton;
CharSequence text=button.getText();
String message=String.format(mButtonMessageTemplate, text);
showToast(message);

}

public void showToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();      

}

另一个问题是

 <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hi_button_lebel" 
        android:onClick="showButtonText"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/bye_button_lebel"
        android:onClick="showButtonText" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/yo_button_lebel"
        android:onClick="showButtonText" />

android:onClick="showButtonText" 这是使用非 onClickListener 方法!如何??请给我一个详细的答案。提前致谢。:)

4

4 回答 4

1
 android:onClick="showButtonText"

那是你的听众。单击该视图时,将执行 showButtonText 方法。

这是 xml 代码中的 View.OnClickListener。编译后会变成你熟悉的java代码。

注意:将 onclickListener 放在 xml 代码中是一个坏习惯。你应该做的是:

button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener(){
    public void onclick(View v){
    //do what happens on click of button1
        showToast("button1 clicked.");

    }
});
于 2013-10-28T16:51:37.517 回答
0

Android 允许您使用该android:onClick属性自动创建一个侦听器,该侦听器在您的Activity类中调用该方法。

该方法必须接收类型的参数View才能使其工作。

于 2013-10-28T16:53:06.643 回答
0

您所有的按钮都设置了 onClick 属性来调用该方法

showButtonText(View clickedButton)

这个方法中有一个语句来显示吐司。

showToast(message);

因此,每次您单击任何按钮时,它都会显示吐司。

于 2013-10-28T16:58:33.033 回答
0

这是 View.java 中的代码。
如果视图具有“onClick”属性,则视图的构造函数会创建并注册“OnClickListener”。

public View(Context context, AttributeSet attrs, int defStyle) {
....
    case R.styleable.View_onClick:
    if (context.isRestricted()) {
        throw new IllegalStateException("The android:onClick attribute cannot "
                + "be used within a restricted context");
    }   

    final String handlerName = a.getString(attr);
    if (handlerName != null) {
        setOnClickListener(new OnClickListener() {
            private Method mHandler;

            public void onClick(View v) {
                if (mHandler == null) {
                    try {
                        mHandler = getContext().getClass().getMethod(handlerName,
                                View.class);
                    } catch (NoSuchMethodException e) {
                        int id = getId();
                        String idText = id == NO_ID ? "" : " with id '"
                                + getContext().getResources().getResourceEntryName(
                                    id) + "'";
                        throw new IllegalStateException("Could not find a method " + 
                                handlerName + "(View) in the activity "
                                + getContext().getClass() + " for onClick handler"
                                + " on view " + View.this.getClass() + idText, e); 
                    }   
                }   

                try {
                    mHandler.invoke(getContext(), View.this);
                } catch (IllegalAccessException e) {
                    throw new IllegalStateException("Could not execute non "
                            + "public method of the activity", e); 
                } catch (InvocationTargetException e) {
                    throw new IllegalStateException("Could not execute "
                            + "method of the activity", e); 
                }     
            }             
        });               
    }   
    break;
....
}
于 2013-10-28T17:10:16.243 回答