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)
一般的控件只要是继承了View 都可以添加这两个事件,只需要重写View的setOnClicklistener和setOnLongClickListener这两个函数就可以了。 添加这两个函数,别人就能用set方法给你传进来listener,而你可以在onTouch方法里通过判断aciton_down action_move action_up 通过时间来判断是长按还是单击。
“答案来源于网络,供您参考” 希望以上信息可以帮到您!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。