Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从按钮数组中修改按钮_Android_Android Button - Fatal编程技术网

Android 从按钮数组中修改按钮

Android 从按钮数组中修改按钮,android,android-button,Android,Android Button,我正在尝试编写一个程序,以便每当按下名为“front”的按钮时,所有其他按钮都将变为灰色,但与绿色按钮相等的按钮除外。我正在努力访问for循环中的按钮,并不断得到一个空指针异常 完整的logcat如下所示,表明当我试图访问循环中的阵列时,NPE正在发生 09-20 11:50:54.727 5302-5302/com.example.kshah.movingbutton E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.

我正在尝试编写一个程序,以便每当按下名为“front”的按钮时,所有其他按钮都将变为灰色,但与绿色按钮相等的按钮除外。我正在努力访问for循环中的按钮,并不断得到一个空指针异常

完整的logcat如下所示,表明当我试图访问循环中的阵列时,NPE正在发生

09-20 11:50:54.727 5302-5302/com.example.kshah.movingbutton E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.example.kshah.movingbutton, PID: 5302
  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setBackgroundColor(int)' on a null object reference
      at com.example.kshah.movingbutton.MainActivity$1.onTouch(MainActivity.java:108)
      at android.view.View.dispatchTouchEvent(View.java:9296)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
      at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
      at android.app.Activity.dispatchTouchEvent(Activity.java:2771)
      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
      at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
      at android.view.View.dispatchPointerEvent(View.java:9520)
      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922)
      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896)
      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857)
      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6025)
      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
      at android.os.MessageQueue.nativePollOnce(Native Method)
      at android.os.MessageQueue.next(MessageQueue.java:323)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.ActivityThread.main(ActivityThread.java:5417)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
代码:

public类MainActivity扩展了AppCompatActivity{
私人按钮前;
专用按钮a;
专用按钮b1;
专用按钮b2;
专用按钮b3;
专用按钮b4;
按钮[]按钮={前面,a,b1,b2,b3,b4};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
前=(按钮)findViewById(R.id.front);
a=(按钮)findViewById(R.id.a);
b1=(按钮)findViewById(R.id.b1);
b2=(按钮)findViewById(R.id.b2);
b3=(按钮)findViewById(R.id.b3);
b4=(按钮)findViewById(R.id.b4);
front.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图、运动事件){
按钮绿色按钮=b3;

对于(int i=0;i,不能像这样将引用存储在初始值设定项数组中

Button[] buttons = {front,a,b1,b2,b3,b4};
但是为什么呢?让我们去看电影吧

要构造的数组的长度等于 立即由数组大括号括起的变量初始值设定项 将为该长度的新数组分配空间。如果 空间不足,无法分配数组,无法计算 数组初始值设定项通过抛出OutOfMemoryError突然完成。 否则,
将创建指定长度的一维数组
并且数组的每个组件都初始化为其默认值

因此,这里的参考值将被mean
null
值替换,因此它们不能再跟踪实际参考值的变化

因此,解决方案是使用所需的长度声明
数组
数组列表
,并向其添加引用

//                  {null,null,null,....}
//Button[] buttons = {front,a,b1,b2,b3,b4};
  Button[] buttons = new Button[6];

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

    buttons[0] = (Button) findViewById(R.id.front);
    buttons[1] = (Button) findViewById(R.id.a);
    buttons[2] = (Button) findViewById(R.id.b1);
    buttons[3] = (Button) findViewById(R.id.b2);
    buttons[4] = (Button) findViewById(R.id.b3);
    buttons[5] = (Button) findViewById(R.id.b4);

    buttons[0].setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
                Button GreenButton = b3;
            // note < instead of <=
            for(int i = 0; i < buttons.length; i++) {
                if (buttons[i] == buttons[4]) {
                    buttons[i].setBackgroundColor(Color.GREEN);
                }
                else
                    buttons[i].setBackgroundColor(Color.GRAY);
            }
            return false;
        }
    });
/{null,null,null,…}
//按钮[]按钮={前面,a,b1,b2,b3,b4};
按钮[]按钮=新按钮[6];
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
按钮[0]=(按钮)findViewById(右前id);
按钮[1]=(按钮)findViewById(R.id.a);
按钮[2]=(按钮)findViewById(R.id.b1);
按钮[3]=(按钮)findViewById(R.id.b2);
按钮[4]=(按钮)findViewById(R.id.b3);
按钮[5]=(按钮)findViewById(R.id.b4);
按钮[0]。setOnTouchListener(新视图。OnTouchListener(){
@凌驾
公共布尔onTouch(视图、运动事件){
按钮绿色按钮=b3;

//注意<您可以尝试使用新按钮[size],而不是,如下所示:

// allocates memory for 6 button.
Button[] buttons = new Button[6]; 
然后,向其添加按钮:

front = (Button) findViewById(R.id.front);
a = (Button) findViewById(R.id.a);
b1 = (Button) findViewById(R.id.b1);
b2 = (Button) findViewById(R.id.b2);
b3 = (Button) findViewById(R.id.b3);
b4 = (Button) findViewById(R.id.b4);

buttons[0] = front;
buttons[1] = a;
buttons[2] = b1;
buttons[3] = b2;
buttons[4] = b3;
buttons[5] = b4;

说明

使用以下各项创建阵列时:

private Button front;
private Button a;
private Button b1;
private Button b2;
private Button b3;
private Button b4;

Button[] buttons = {front,a,b1,b2,b3,b4};
您正在创建一个包含空对象元素的数组,如下所示

Button[] buttons = {null,null,null,null,null,null};
然后,将按钮分配给其中一个数组成员时,使用:

front = (Button) findViewById(R.id.front);
您正在将一个对象分配给
front
而不是
按钮[0]


您可以尝试以下代码来理解上述解释的含义:

public class MainActivity extends AppCompatActivity {
  public static final String TAG = MainActivity.class.getSimpleName();

  private Button front;
  private Button a;
  private Button b1;
  private Button b2;
  private Button b3;
  private Button b4;

  Button[] buttons = {front,a,b1,b2,b3,b4};

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

    // Check address:
    Log.d(TAG, "Before initializing..");
    for(int i = 0; i < buttons.length; i++) {
      Log.d(TAG, "i " + buttons[i]);
    }
    front = (Button) findViewById(R.id.front);
    a = (Button) findViewById(R.id.a);
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b3 = (Button) findViewById(R.id.b3);
    b4 = (Button) findViewById(R.id.b4);
    Log.d(TAG, "After initializing..");
    for(int i = 0; i < buttons.length; i++) {
      Log.d(TAG, "i " + buttons[i]);
    }

    Log.d(TAG, "After assigning..");
    Log.d(TAG, "front " + front);
    Log.d(TAG, "a " + a);
    Log.d(TAG, "b1 " + b1);
    Log.d(TAG, "b2 " + b2);
    Log.d(TAG, "b3 " + b3);
    Log.d(TAG, "b4 " + b4);

  }
}
public类MainActivity扩展了AppCompatActivity{
公共静态最终字符串标记=MainActivity.class.getSimpleName();
私人按钮前;
专用按钮a;
专用按钮b1;
专用按钮b2;
专用按钮b3;
专用按钮b4;
按钮[]按钮={前面,a,b1,b2,b3,b4};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//检查地址:
Log.d(标记“初始化前…”);
对于(int i=0;i
for(int i=0;我发布了完整的错误日志。不要修改或修剪(int i=0;i
not
@Pavneet_Singh,这仍然会导致上面错误中显示的空指针异常
public class MainActivity extends AppCompatActivity {
  public static final String TAG = MainActivity.class.getSimpleName();

  private Button front;
  private Button a;
  private Button b1;
  private Button b2;
  private Button b3;
  private Button b4;

  Button[] buttons = {front,a,b1,b2,b3,b4};

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

    // Check address:
    Log.d(TAG, "Before initializing..");
    for(int i = 0; i < buttons.length; i++) {
      Log.d(TAG, "i " + buttons[i]);
    }
    front = (Button) findViewById(R.id.front);
    a = (Button) findViewById(R.id.a);
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b3 = (Button) findViewById(R.id.b3);
    b4 = (Button) findViewById(R.id.b4);
    Log.d(TAG, "After initializing..");
    for(int i = 0; i < buttons.length; i++) {
      Log.d(TAG, "i " + buttons[i]);
    }

    Log.d(TAG, "After assigning..");
    Log.d(TAG, "front " + front);
    Log.d(TAG, "a " + a);
    Log.d(TAG, "b1 " + b1);
    Log.d(TAG, "b2 " + b2);
    Log.d(TAG, "b3 " + b3);
    Log.d(TAG, "b4 " + b4);

  }
}