android-Android自定义控件中为Button设置自定义监听器出现空指针。

问题描述

Android自定义控件中为Button设置自定义监听器出现空指针。

Android自定义TopBar中给ImageButton设置自定义点击监听器,当点击ImageButton时在listener处出现NullPointerException。

会出错的地方我在后面写了//TODO 。

请问为什么会出现listener没有被实例化的情况?

还有为什么在MainActivity中使用findViewById实例化TopBar也会出现不能实例化控件的情况?

IDE : Android Studio ;

Compile Sdk Version : API 23 ;

Build Tool Version : 23.0.1 ;

Min Sdk Version : API 15 ;

Target Sdk Version : API 19 ;

部分代码:

#MainActivity.java

public class MainActivity extends AppCompatActivity {

    private TopBar topBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        topBar = (TopBar) findViewById(R.id.topBar);        //TODO 这样无法实例化topBar  ???
        topBar = new TopBar(getApplicationContext(), null);

        if (topBar == null) {
            Toast.makeText(MainActivity.this, "NULL", Toast.LENGTH_SHORT).show();
        }

        topBar.setOnTopBarClickListener(new TopBar.OnClickListener() {
            @Override
            public void onLeftButtonClick() {
                Toast.makeText(MainActivity.this, "Left", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onRightButtonClick() {
                Toast.makeText(MainActivity.this, "Right", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

#TopBar.java

public class TopBar extends RelativeLayout {

    private ImageButton ibtLeft;
    private ImageButton ibtRight;
    private TextView tvTitle;

    private OnClickListener listener;

    public interface OnClickListener {

        void onLeftButtonClick();

        void onRightButtonClick();
    }

    public void setOnTopBarClickListener(OnClickListener listener) {
        this.listener = listener;
    }

    public TopBar(Context context, AttributeSet attrs) {
        super(context);
        LayoutInflater.from(context).inflate(R.layout.layout_top_bar, this);

        ibtLeft = (ImageButton) findViewById(R.id.ibt_left);
        ibtRight = (ImageButton) findViewById(R.id.ibt_right);
        tvTitle = (TextView) findViewById(R.id.tv_title);

        ibtLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), "leftButton", Toast.LENGTH_SHORT).show();      //Toast可以显示
//                listener.onLeftButtonClick();       //TODO NullPointerException  为什么没有实例化listener?
            }
        });

        ibtRight.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onRightButtonClick();       //TODO NullPointerException
            }
        });

    }
}

#logcat输出

10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime: FATAL EXCEPTION: main
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime: java.lang.NullPointerException
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at com.vder.puzzlegame.ui.TopBar$2.onClick(TopBar.java:55)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at android.view.View.performClick(View.java:4204)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:17355)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:725)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:92)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5041)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-14 13:42:14.442 1366-1366/com.vder.puzzlegame E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)

解决方案

构造方法不对,像这样,把三个全上才可以在Xml文件中使用

public MyView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
}

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

public MyView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

解决方案二:

你的_activity__main.xml_是怎么写的??自定义控件要加上包名 吧

解决方案三:

同楼上,有可能是你布局的自定义控件没指向到这个自定义控件的类。

时间: 2024-08-04 10:38:53

android-Android自定义控件中为Button设置自定义监听器出现空指针。的相关文章

ase ctivity-BaseActivity下自定义actionbar中的button设置点击事件无效,代码见下。

问题描述 BaseActivity下自定义actionbar中的button设置点击事件无效,代码见下. package com.lyri.main.base; import com.example.LlsqPs.R; import android.app.ActionBar;import android.app.Activity;import android.app.ActionBar.LayoutParams;import android.content.Context;import and

button点击事件-Android开发listView中的Button点击事件被拦截

问题描述 Android开发listView中的Button点击事件被拦截 根据http://blog.csdn.net/boylinux/article/details/8860443 这位大神的帖子,我的代码如下,现在的问题是Listview中的Button和imageview和textview控件点击之后不会响应,而在滑动一下Listview后,之前的点击事件才会响应,导致这个问题的原因不明,但是如果不用HashMap这个MAP的话,就不会有这个问题,请问大神们这是为什么呢?代码如下: p

android-ExpandableListView,给group中的button设置Context menu

问题描述 ExpandableListView,给group中的button设置Context menu 我已经给ExpandableListView添加好了Context menu,现在在此ExpandableListView的group中有一个button(图中红色框),我想点击这个button后也出现同样的Context menu,如图,,多谢各位了.. 解决方案 http://womajiaozhu.blog.163.com/blog/static/4909835920132743172

android id-android开发中XML Id设置问题

问题描述 android开发中XML Id设置问题 在xml文件中,设置控件ID 时android:id="@+id/tabs"和 android:id="@android:id/tabs"的区别是什么..??? 解决方案 @+id 新增一个资源id @id和android:id,引用现有的资源id

Android在代码中按照SP设置字体的大小

private void init(){ mTextView=(TextView) findViewById(R.id.textView); mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); }

asp.net自定义控件中ToolboxBitmap元数据设置详细说明

在asp.net应用的过程中,少不了的会创建一些自定义服务器控件,但控件完成后,默认的图标是统 一的蓝色齿轮的图标,没有个性,也不能很好的直观表示控件的作用,这时我们需要自己添加自定义的 工具图标 自定义图标为16像素宽高,256色的BMP图片,并设置图标文件的BuildingAction(生成操作)属性为嵌 入的资源,但我们添加完成后在工具箱里显示不了自定义图标,这与我们类文件的名称空间有关 例一: 说明:控件未定义名称空间,图标文件名与控件的名称一致 控件集名称为:MyControls.dl

Word2010中给符号设置自定义快捷键

通过在Word2010文档中为常用符号指定快捷键,用户能够通过键盘直接输入常用符号.这里所说的快捷键是指Ctrl或Alt与一个或多个字母.符号的组合键.在Word2010中为常用符号指定快捷键的步骤如下所述. 步骤/方法 第1步,打开Word2010文档窗口,切换到"插入"功能区.在"符号"分组中单击"符号"按钮,并单击"其它符号"选项,如图1所示. 第2步,打开"符号"对话框,选中准备指定快捷键的符号(例

如何给Word2010中的符号设置自定义快捷键

  在Word文档中,鼠标放到需要插入圆点处单击,然后打开"插入"标签,在符号栏中单击"符号"按钮,一些常用符号会在此列出,如果有您需要的,单击选中即可.如果这里没有需要的圆点,请点击菜单底部的"其它符号"链接.     弹出符号对话窗后,在"子集"下拉菜单中选择一个合适的符号种类.这里,我们选择"广义标点"来举例.选中圆点图标后,单击"插入"按钮.(先不要关闭符号对话窗) PS: 对话

button形状-在android开发中,怎么设置我的ImageButton控件的形状

问题描述 在android开发中,怎么设置我的ImageButton控件的形状 我按照百度上教的,发现没什么效果,这是我控件的代码: android:id="@+id/button" android:layout_width="102dp" android:layout_height="133dp" android:background="@drawable/a" /> <ImageButton android:i