为什么我的视图数组返回null?

时间:2014-03-03 15:50:49

标签: java android arrays nullpointerexception views

我在android中有一组开关;我们打电话给他们......

Switch one;
Switch two;
Switch three;
Switch four;
Switch five;

我也有一个包含这些视图的数组。

Switch[] switchArray = {one, two, three, four, five};

然后,在我的onCreateView()方法中;我使用findViewById()分配所有这些开关。

one = (Switch) findViewById(R.id.switchOne);
two = (Switch) findViewById(R.id.switchTwo);
three = (Switch) findViewById(R.id.switchThree);
four = (Switch) findViewById(R.id.switchFour);
five = (Switch) findViewById(R.id.switchFive);

现在;当我创建一个for循环来检查该数组是否为null时:

    for(int i = 0; i<switchArray.length; i++){
      if(switchArray[i] == null){
         Log.d(TAG, "Array is null at:" + i);
     }
    }

我得到以下logcat:

Array is null at: 1
Array is null at: 2
Array is null at: 3
Array is null at: 4
Array is null at: 5

我不确定为什么这些变量返回null如果我试图在onCreate中实例化它们...如果我也尝试在onCreate之前实例化它们(在任何方法之前的类头中);我仍然得到同样的错误。

希望问题很清楚。

编辑1:完整的ONCREATEVIEW方法

public View onCreateView(LayoutInflater viewInflation, ViewGroup container,
            Bundle SavedInstantState) {
        superContext = getActivity().getApplicationContext();
        digitalfragmentview = viewInflation.inflate(
                R.layout.digitalfragment_page, container, false);

        digitalIO0Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio0mode);
        digitalIO1Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio1mode);
        digitalIO2Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio2mode);
        digitalIO3Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio3mode);
        digitalIO4Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio4mode);
        digitalIO5Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio5mode);
        digitalIO6Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio6mode);
        digitalIO7Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio7mode);
        digitalIO8Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio8mode);
        digitalIO9Mode = (Switch) digitalfragmentview
                .findViewById(R.id.digitalio9mode);

        // sets the listener for the mode switches
        for (int i = 0; i < digitalIOModeSwitchArray.length; i++) {
            if (digitalIOModeSwitchArray[i] == null) {
                Log.d(TAG, "Array is null at:" + i);
            }
        }

        return digitalfragmentview;
    }

3 个答案:

答案 0 :(得分:3)

Switch[] switchArray = {one, two, three, four, five};

在您创建数组时包含对one, two, three, four, five的引用。

后来,你重新分配这些变量,但你的数组仍指向先前的引用。

您需要在分配视图后创建阵列:

one = (Switch) findViewById(R.id.switchOne);
two = (Switch) findViewById(R.id.switchTwo);
three = (Switch) findViewById(R.id.switchThree);
four = (Switch) findViewById(R.id.switchFour);
five = (Switch) findViewById(R.id.switchFive);
// Then only
switchArray = {one, two, three, four, five};

答案 1 :(得分:2)

首先在变量中引用您的小部件 one = (Switch) findViewById(R.id.switchOne); two = (Switch) findViewById(R.id.switchTwo); three = (Switch) findViewById(R.id.switchThree); four = (Switch) findViewById(R.id.switchFour); five = (Switch) findViewById(R.id.switchFive);

然后把它们放在一个数组

Switch[] switchArray = {one, two, three, four, five};

原因是Switch数组是值类型而不是引用类型

答案 2 :(得分:1)

试试这个..

one = (Switch) findViewById(R.id.switchOne);

而不是这个..

one = findViewById(R.id.switchOne);

修改

switchArray[0] = (Switch) findViewById(R.id.switchOne);