Java onClick()的Android问题
谢谢大家,我成功了!我不得不插上一个开关((按钮)v) 我对编码很陌生,不明白为什么我的代码不起作用。 我想将所有三个按钮组合在一个方法下Java onClick()的Android问题,java,android,Java,Android,谢谢大家,我成功了!我不得不插上一个开关((按钮)v) 我对编码很陌生,不明白为什么我的代码不起作用。 我想将所有三个按钮组合在一个方法下onClick(),android studio向我显示,所有内容都是无错误编写的,但当我运行应用程序时,它会立即关闭 package com.example.trafficlight; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import andr
onClick()
,android studio向我显示,所有内容都是无错误编写的,但当我运行应用程序时,它会立即关闭
package com.example.trafficlight;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
final Button LightSide = (Button) findViewById(R.id.LightSide);
final Button DarkSide = (Button) findViewById(R.id.DarkSide);
final Button Chubaka = (Button) findViewById(R.id.Chubaka);
private RelativeLayout mRelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRelativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
LightSide.setOnClickListener(this);
DarkSide.setOnClickListener(this);
Chubaka.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.LightSide:
LightSide.setText("LightSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
case R.id.DarkSide:
DarkSide.setText("DarkSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
case R.id.Chubaka:
Chubaka.setText("Chubakka");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorBrown));
}
}
}
这是错误代码
05-16 12:43:06.874 8223-8223/com.example.trafficlight E/AndroidRuntime:致命异常:main
进程:com.example.trafficlight,PID:8223
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.Button.setText(java.lang.CharSequence)”
位于com.example.trafficlight.MainActivity.onClick(MainActivity.java:36)
在android.view.view.performClick上(view.java:4780)
在android.view.view$PerformClick.run(view.java:19866)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5254)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)上
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)上,您需要将您的
findViewById
调用移动到onCreate方法中:
Button mLightSide;
Button mDarkSide;
Button mChubaka;
private RelativeLayout mRelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRelativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
mLightSide = (Button) findViewById(R.id.LightSide);
mDarkSide = (Button) findViewById(R.id.DarkSide);
mChubaka = (Button) findViewById(R.id.Chubaka);
mLightSide.setOnClickListener(this);
mDarkSide.setOnClickListener(this);
mChubaka.setOnClickListener(this);
}
您需要将
findViewById
调用移动到onCreate方法中:
Button mLightSide;
Button mDarkSide;
Button mChubaka;
private RelativeLayout mRelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRelativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
mLightSide = (Button) findViewById(R.id.LightSide);
mDarkSide = (Button) findViewById(R.id.DarkSide);
mChubaka = (Button) findViewById(R.id.Chubaka);
mLightSide.setOnClickListener(this);
mDarkSide.setOnClickListener(this);
mChubaka.setOnClickListener(this);
}
试试这个在OnCreate方法中初始化所有按钮。
插入
break代码>在每个案例之后
case R.id.LightSide:
LightSide.setText("LightSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
break;
case R.id.DarkSide:
DarkSide.setText("DarkSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
break;
case R.id.Chubaka:
Chubaka.setText("Chubakka");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorBrown));
break;
试试这个
在OnCreate方法中初始化所有按钮。
插入break代码>在每个案例之后
case R.id.LightSide:
LightSide.setText("LightSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
break;
case R.id.DarkSide:
DarkSide.setText("DarkSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
break;
case R.id.Chubaka:
Chubaka.setText("Chubakka");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorBrown));
break;
这个问题在机制上有点复杂。我猜您已经在xml文件中链接了click事件,其中一个按钮的click事件已被设置(onClick=“onClick”),因为onClick的参数是View,在这种情况下,对于另一个按钮,该方法将仅与已链接的按钮一起工作
简单的回答是:给每个按钮小部件一个唯一的ID,并实现它们的OnClickListner 这个问题在机制上有点复杂。我猜您已经在xml文件中链接了click事件,其中一个按钮的click事件已被设置(onClick=“onClick”),因为onClick的参数是View,在这种情况下,对于另一个按钮,该方法将仅与已链接的按钮一起工作
简单的回答是:给每个按钮小部件一个唯一的ID,并实现它们的OnClickListner 尝试为所有按钮的onClick事件创建一个新函数,不要覆盖活动。此外,插入中断;在每一个这样的案例之后:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRelativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
LightSide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonOnClick(v);
}
});
DarkSide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonOnClick(v);
}
});
Chubaka.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonOnClick(v);
}
});
}
private void buttonOnClick(View v) {
switch (v.getId()) {
case R.id.LightSide:
LightSide.setText("LightSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
break;
case R.id.DarkSide:
DarkSide.setText("DarkSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
break;
case R.id.Chubaka:
Chubaka.setText("Chubakka");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorBrown));
break;
}
}
编辑:
也可以使用NSimon在回答中提到的findViewById方法。尝试为所有按钮的onClick事件创建一个新函数,不要覆盖活动。此外,插入中断;在每一个这样的案例之后:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRelativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
LightSide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonOnClick(v);
}
});
DarkSide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonOnClick(v);
}
});
Chubaka.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonOnClick(v);
}
});
}
private void buttonOnClick(View v) {
switch (v.getId()) {
case R.id.LightSide:
LightSide.setText("LightSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
break;
case R.id.DarkSide:
DarkSide.setText("DarkSide");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorRed));
break;
case R.id.Chubaka:
Chubaka.setText("Chubakka");
mRelativeLayout.setBackgroundColor(getResources().getColor(R.color.colorBrown));
break;
}
}
编辑:
同样,也要像NSimon在回答中所说的那样使用findViewById方法。ok,在调用setContentView
ok后初始化所有按钮的inside onCreate方法,在调用setContentView
后初始化所有按钮的inside onCreate方法,谢谢,现在应用程序打开了,但当我再次尝试点击其中一个按钮时,文本是“不幸的是,trafficlight已经停止了‘如果你在日志中发布你遇到的任何崩溃,人们可能会更容易帮助你,对吗?你可以在我的帖子中看到这一点。)谢谢,现在应用程序打开了,但当我再次尝试单击其中一个按钮时(崩溃),文本是“不幸的是,trafficlight已经停止了‘如果你在日志中发布你遇到的任何事故,人们可能会更容易帮助你,对吗?你可以在我的帖子中看到这一点)