【问题标题】:Android Studio: Issues using spinner in one activity to change background color in anotherAndroid Studio:在一个活动中使用微调器来更改另一个活动的背景颜色的问题
【发布时间】:2017-02-02 10:27:15
【问题描述】:

我对 Android 很陌生。我的课程实验室要求我能够从活动 A (PaletteActivity) 中的微调器中选择一种颜色,并以该颜色作为背景启动活动 B (CanvasActivity)。

但是,应用程序崩溃说我试图在空对象引用上调用虚拟方法 private void setBgColor(String selectedColor)。谁能帮我弄清楚为什么?

这是 PaletteActivity 的代码:

package com.example.codyhunsberger.cis_3515_lab_3;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class PaletteActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_palette);
    final Intent i = new Intent(getApplicationContext(), CanvasActivity.class);

    Spinner spinner = (Spinner) findViewById(R.id.spinner);
    String[] strings = {"Red", "Green", "Blue", "Cyan","Gray","Magenta"};

    ArrayAdapter adapter = new ArrayAdapter(PaletteActivity.this,
            android.R.layout.simple_spinner_dropdown_item,
            strings);

    spinner.setAdapter(adapter);


    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            startActivity(new Intent(PaletteActivity.this, CanvasActivity.class));
            String strName = null;
            String color = parent.getItemAtPosition(position).toString();
            i.putExtra(color, strName);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });


}

}

和 CanvasActivity:

package com.example.codyhunsberger.cis_3515_lab_3;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class CanvasActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_canvas);

        String color = "";

        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            color = "White";
        }
        else {
            extras.getString(color);
        }

        setBgColor(color);
    }

    private void setBgColor(String selectedColor){
        RelativeLayout myLayout = (RelativeLayout) findViewById(R.id.myLayout);

        switch (selectedColor) {
            case "Red":
                myLayout.setBackgroundColor(Color.RED);
                break;
            case "Green":
                myLayout.setBackgroundColor(Color.GREEN);
                break;
            case "Blue":
                myLayout.setBackgroundColor(Color.BLUE);
                break;
            case "Cyan":
                myLayout.setBackgroundColor(Color.CYAN);
                break;
            case "White":
                myLayout.setBackgroundColor(Color.WHITE);
                break;
            case "Gray":
                myLayout.setBackgroundColor(Color.GRAY);
                break;
            case "Magenta":
                myLayout.setBackgroundColor(Color.MAGENTA);
                break;
        }

        if (selectedColor.equals("White")) {
            Toast.makeText(CanvasActivity.this, "Bundle extras is null", Toast.LENGTH_SHORT).show();
        }
    }
}

如果 XML 文件有帮助,我也可以添加它们,但我相当肯定它们不相关。感谢收看!

更新:第二个错误问题的堆栈跟踪:

09-24 14:53:31.600 19931-19931/com.example.codyhunsberger.cis_3515_lab_3 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                           Process: com.example.codyhunsberger.cis_3515_lab_3, PID: 19931
                                                                                           java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.codyhunsberger.cis_3515_lab_3/com.example.codyhunsberger.cis_3515_lab_3.CanvasActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference
                                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
                                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
                                                                                               at android.app.ActivityThread.access$900(ActivityThread.java:157)
                                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)
                                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                                               at android.app.ActivityThread.main(ActivityThread.java:5551)
                                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
                                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
                                                                                            Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference
                                                                                               at com.example.codyhunsberger.cis_3515_lab_3.CanvasActivity.setBgColor(CanvasActivity.java:31)
                                                                                               at com.example.codyhunsberger.cis_3515_lab_3.CanvasActivity.onCreate(CanvasActivity.java:25)
                                                                                               at android.app.Activity.performCreate(Activity.java:6272)
                                                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
                                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494) 
                                                                                               at android.app.ActivityThread.access$900(ActivityThread.java:157) 
                                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356) 
                                                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                               at android.os.Looper.loop(Looper.java:148) 
                                                                                               at android.app.ActivityThread.main(ActivityThread.java:5551) 
                                                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 

【问题讨论】:

    标签: java android null


    【解决方案1】:

    我通过返回我的活动 XML 并添加正确的 ID 解决了这个问题。它们与 Canvas Activity 不匹配。

    默认情况下它仍然会启动到错误的活动,但这是一个单独的问题。

    【讨论】:

      【解决方案2】:

      您需要传递正确的意图来启动活动。更改您的代码如下:

       // startActivity(new Intent(PaletteActivity.this, CanvasActivity.class));
       // String strName = null;
       String color = parent.getItemAtPosition(position).toString();
       i.putExtra("color", color);
       startActivity(i);
      

      另外,在你的CanvasActivity,你需要保存读取的值:

      Bundle extras = getIntent().getExtras();
      if (extras == null) {
          color = "White";
      } 
      else { 
          color = extras.getString("color");
      }
      

      编辑:您的值键在上面使用不正确。进行了更改。

      【讨论】:

      • 感谢您的回复。这无疑让我更接近一个工作产品,但现在有一个更模糊的相同类型的错误消息,但参考方法'int java.lang.String.hashCode()'
      • @user3491551 你能发布堆栈跟踪吗?
      • @hunsbct 好的,您在第二个活动中也进行了必要的更改,对吧?另外,在调用setBgColor(color);之前记录color的值
      • 我对两者都进行了更改,并在方法调用之前记录了值。
      • 我相信是这样,我看到了您对原始回复的编辑并更新了所有内容。现在又说 void android.widget.RelativeLayout.setBackgroundColor(int) 在空对象引用上被调用。
      猜你喜欢
      • 2019-01-12
      • 2021-11-26
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      相关资源
      最近更新 更多