【问题标题】:Android problems with onClick()onClick() 的 Android 问题
【发布时间】:2016-05-16 10:20:03
【问题描述】:

谢谢大家,我成功了!我必须放入一个开关 ((Button) 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)

【问题讨论】:

  • ok,调用setContentView 后初始化所有Button里面的onCreate方法

标签: java android


【解决方案1】:

您需要将您的 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);


}

【讨论】:

  • 谢谢,现在应用程序打开了,但是当我再次尝试单击其中一个按钮时崩溃)文本是“不幸的是,交通灯已停止”
  • 如果您在 logcat 中发布您遇到的任何崩溃,也许人们会更容易帮助您,对吧?
  • 你可以在我的帖子中看到)
【解决方案2】:

试试这个

在 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;

【讨论】:

    【解决方案3】:

    这个问题在机制上有点复杂。我猜您已经在 xml 文件中链接了单击事件,其中设置了按钮的单击事件之一(onClick="onClick"),因为 onclick 的参数是 View,在这种情况下,该方法仅适用于该按钮已链接,用于其他按钮。

    简短的回答是:给每个按钮小部件一个唯一的 ID,并实现它们的 OnClickListner;

    【讨论】:

      【解决方案4】:

      尝试为所有按钮的 onClick 事件创建一个新函数,并且不要覆盖 Activity 之一。另外,插入中断;在这样的每个案例之后:

      @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 方法放在他/她的回答中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        • 2017-12-02
        • 2016-12-07
        相关资源
        最近更新 更多