首页 日常

最简单的办法就是在xml的控件里写android:onClick="method",然后在activity里面写对应的方法。

在activity里直接写findViewById会出现空指针异常,因为当前activity对应的页面里面找不到要绑定的控件。
于是在网上查到了另外一种办法:
View view = getLayoutInflater().inflate(R.layout.test_layout, null);
test_layout为想要添加点击事件的控件的页面,这样可以找到那个控件虽然不会报空指针异常,但是新建了一个View和当前activity使用的View不是同一个View,所以就算设置了点击事件也无效。

发现这个问题是在写AlertDialog的时候自定义了AlertDialog的View,然后里面有Button需要设置点击事件

AlertDialog.Builder adBuilder = new AlertDialog.Builder(MainActivity.this);
View dialogLayout = getLayoutInflater().inflate(R.layout.dialog, null);
adBuilder.setView(dialogLayout);
ad = adBuilder.create();
ad.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
View view = getLayoutInflater().inflate(R.layout.test_layout, null);
Button close = view.findViewById(R.id.close);
close.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ad.dismiss();
    }
});
ad.show();

dialog为自定义的AlertDialog页面,然后给Button添加点击事件,看似没问题,但是前面
View dialogLayout = getLayoutInflater().inflate(R.layout.dialog, null);
已经获取了那个页面,然后后面又新建了一个
View view = getLayoutInflater().inflate(R.layout.test_layout, null);
导致AlertDialog显示View和Button的点击事件View不是同一个View,所以就会点击无效。

AlertDialog.Builder adBuilder = new AlertDialog.Builder(MainActivity.this);
View dialogLayout = getLayoutInflater().inflate(R.layout.dialog, null);
adBuilder.setView(dialogLayout);
ad = adBuilder.create();
ad.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
Button close = dialogLayout.findViewById(R.id.close);
close.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ad.dismiss();
    }
});
ad.show();

将Button的View和AlertDialog的View设置为同一个就可以解决这问题。




文章评论