Java onClick()的Android问题

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

谢谢大家,我成功了!我不得不插上一个开关((按钮)v)

我对编码很陌生,不明白为什么我的代码不起作用。 我想将所有三个按钮组合在一个方法下
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已经停止了‘如果你在日志中发布你遇到的任何事故,人们可能会更容易帮助你,对吗?你可以在我的帖子中看到这一点)