如何为动态添加的按钮添加单击事件

时间:2013-07-04 07:03:33

标签: android layout onclicklistener

public class ShowActivity extends Activity  implements OnClickListener{

    private LinearLayout llaouyBase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.dashboardactivity);
        llaouyBase = (LinearLayout) findViewById(R.id.llaouyBase);
        Button t;

        for(int i=0;i<5;i++) {
            t= new Button(ShowActivity.this);
            t.setId(i);
            t.setOnClickListener(this);
            llaouyBase.addView(t, i);
        }
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(),
                v.getId(), 8000).show();
    }
}

这是我的活动,在布局中我有一个空白的线性布局,方向为vertical.Im尝试添加5个按钮,我可以成功。我如何将点击事件添加到这些按钮?运行时,我得到资源未找到例外。

07-04 12:22:07.535: E/AndroidRuntime(20957): FATAL EXCEPTION: main
07-04 12:22:07.535: E/AndroidRuntime(20957): android.content.res.Resources$NotFoundException: String resource ID #0x3
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.content.res.Resources.getText(Resources.java:233)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.widget.Toast.makeText(Toast.java:265)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at com.example.testapp.ShowActivity.onClick(ShowActivity.java:55)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.view.View.performClick(View.java:4103)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.view.View$PerformClick.run(View.java:17117)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.os.Handler.handleCallback(Handler.java:615)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.os.Looper.loop(Looper.java:137)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at android.app.ActivityThread.main(ActivityThread.java:4744)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at java.lang.reflect.Method.invokeNative(Native Method)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at java.lang.reflect.Method.invoke(Method.java:511)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-04 12:22:07.535: E/AndroidRuntime(20957):    at dalvik.system.NativeStart.main(Native Method)

我按照这个链接给出了以下内容。我在这段代码中缺少什么?

How to identify the button clicked from a dynamically generated table

4 个答案:

答案 0 :(得分:3)

更改

Toast.makeText(getApplicationContext(),
                    v.getId(), 8000).show();

Toast.makeText(getApplicationContext(),
                    String.valueOf(v.getId()), 8000).show();

如果将一个int值作为第二个参数传递给makeText,android会在id内查找R.string的字符串。如果它不存在,您的应用会因android.content.res.Resources$NotFoundException:

而崩溃

答案 1 :(得分:2)

这是问题

     Toast.makeText(getApplicationContext(),
                v.getId(), 8000).show();

将其更改为

      Toast.makeText(getApplicationContext(),
                ""+v.getId(), 8000).show();

        Toast.makeText(getApplicationContext(),
            String.valueOf(v.getId()), 8000).show();

您正在使用以下

public static Toast makeText (Context context, int resId, int duration)

制作标准吐司,其中只包含带有资源文本的文本视图。

<强>参数

context The context to use. Usually your Application or Activity object.
resId   The resource id of the string resource to use. Can be formatted text.
duration    How long to display the message. Either LENGTH_SHORT or LENGTH_LONG

如果找不到资源则抛出

Resources.NotFoundException

它期望一个不存在的int资源。因此,例外。

您应该使用以下

public static Toast makeText (Context context, CharSequence text, int duration)

上述方法需要CharacterSequence,因此请使用String.valueOf(v.getId())

答案 2 :(得分:1)

更改

Toast.makeText(getApplicationContext(),
                    v.getId(), 8000).show();

Toast.makeText(getApplicationContext(),
                    v.getId().toString(), 8000).show();

答案 3 :(得分:1)

我想我发现了here

  

public static Toast makeText(Context context,int resId,int   持续时间)

     

在API级别1中添加制作仅包含文本的标准Toast   查看来自资源的文本。

     

参数context要使用的上下文。通常你的应用程序或   活动对象。 resId要使用的字符串资源的资源ID。   可以格式化文本。持续时间显示消息的时间长度。    LENGTH_SHORT或LENGTH_LONG 如果资源不能,则抛出   找到。 Resources.NotFoundException public static Toast makeText   (上下文上下文,CharSequence文本,int持续时间)

     

在API级别1中添加制作仅包含文本的标准Toast   图。

     

参数context要使用的上下文。通常你的应用程序或   活动对象。 text要显示的文本。可以格式化文本。   持续时间显示消息的时间长度。 LENGTH_SHORT或   LENGTH_LONG

更改

    Toast.makeText(getApplicationContext(),
            v.getId(), 8000).show();

    Toast.makeText(getApplicationContext(),
            String.valueOf(v.getId()), Toast.LENGTH_LONG).show();