не могу найти это NullPointerException - PullRequest
0 голосов
/ 26 мая 2011

Я продолжаю получать Unable to instantiate activity ComponentInfo... Caused by a NullPointerException at findViewById, и я не могу понять, почему он его выбрасывает. У меня правильно установлены идентификаторы элементов в моем main.xml, и я попытался закомментировать каждую строку вокруг того, куда он бросает, чтобы увидеть, какая строка неисправна, но чтобы заставить ее работать без закрытия, я должен закомментировать все функциональность программы. вот моя деятельность:

package fsg.dev.test.checkboxtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.SeekBar;

public class checkBoxTest extends Activity {
    private CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox);
    //private SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);
    private View view = (View) findViewById(R.id.background);

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
            changeColor();
        }
    });
}

private void changeColor(){
    if(checkbox.isChecked()){
        view.setBackgroundColor(R.color.Blue);
        //view.setAlpha(.25);
    }
    else if(!checkbox.isChecked()){
        view.setBackgroundColor(R.color.White);
    }
}

}

и вот мой манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="fsg.dev.test.checkboxtest"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />

<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name=".checkBoxTest"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

и, наконец, мой main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<CheckBox 
    android:text="Background Color" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="false"
    android:id="@+id/checkbox">
</CheckBox>
<SeekBar 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent"
    android:id="@+id/seekbar" 
    android:layout_margin="10dip" >
</SeekBar>
<View
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/White"
    android:id="@+id/background">
</View>
</LinearLayout>

если бы кто-нибудь мог помочь мне сузить это, это было бы превосходно.

Ответы [ 5 ]

9 голосов
/ 26 мая 2011

Вам нужно использовать findViewById только после setContentView:

....
public class checkBoxTest extends Activity {
    private CheckBox checkbox;
    private View view;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    checkbox = (CheckBox) findViewById(R.id.checkbox);
    view = (View) findViewById(R.id.background);
    checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
            changeColor();
        }
    });
}
...
2 голосов
/ 26 мая 2011

Вам необходимо вызвать findViewById в вашем методе onCreate () после того, как вы вызвали setContentView (R.layout.main), поскольку ваши объекты пользовательского интерфейса не будут существовать до тех пор, пока XML не будет накачан до соответствующих им объектов Java.

1 голос
/ 26 мая 2011

Это воплощение

private CheckBox checkbox = (CheckBox) findViewById(R.id.checkbox);
    //private SeekBar seekbar = (SeekBar) findViewById(R.id.seekbar);
    private View view = (View) findViewById(R.id.background);

Должен прийти по методу onCreate.

1 голос
/ 26 мая 2011

переместите ваши вызовы findViewById в метод OnCreate.

0 голосов
/ 26 мая 2011

Первое, что нужно сделать, это установить Содержимое вашей активности, а затем вы можете получить все представления из этого содержимого, поэтому замените свой код на это:

public class checkBoxTest extends Activity {
    private CheckBox checkbox ;
    private View view ;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
//first , set the content of your activity
        setContentView(R.layout.main);
    //Second, get yours Views 
     checkbox = (CheckBox) findViewById(R.id.checkbox);
     view = (View) findViewById(R.id.background);

        checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
                changeColor();
            }
        });
    }
....
...