不幸的是,Callisto已停止工作了

时间:2012-12-03 06:07:07

标签: java android xml eclipse nullpointerexception

所以当我尝试在模拟器中运行我的代码时,应用程序背景弹出然后关闭给我对话框,“不幸的是,Callisto已停止工作” 除了它给我一个空指针异常(第49行),我不知道出了什么问题,但第49行没有任何内容

XML          

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/callisto_heading" />

<Button
    android:id="@+id/bClasses"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Classes" 
    android:layout_gravity="center"
    android:onClick=""
   />

<Button
    android:id="@+id/bSettings"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Settings" 
    android:layout_gravity="center" 
    android:onClick=""  
 />

</LinearLayout>

爪哇     包android.callisto.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;

public class CallistoActivity extends Activity {
/** Called when the activity is first created. */
 Button settings_button;
 Button classes_button;
 Button home_button;
 CheckBox notif_cb;
 CheckBox math_cb;
 CheckBox science_cb;
 CheckBox ss_cb;
 CheckBox english_cb;
 CheckBox language_cb;

 boolean notif,math,science,english,ss,language;




 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    //settings layout
    notif_cb = (CheckBox) findViewById(R.id.cbNotif);
    math_cb = (CheckBox) findViewById(R.id.cbMath);
    science_cb = (CheckBox) findViewById(R.id.cbScience);
    ss_cb = (CheckBox) findViewById(R.id.cbSS);
    english_cb = (CheckBox) findViewById(R.id.cbEnglish);
    language_cb = (CheckBox) findViewById(R.id.cbLang);
    home_button = (Button) findViewById(R.id.bHome);

    notif = true;
    math = true;
    science = true;
    english = true;
    ss = true;
    language = true;

    home_button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            setContentView(R.layout.main);

        }
    });        

        //notifications

    //main layout
    settings_button = (Button) findViewById(R.id.bSettings);
    classes_button = (Button) findViewById(R.id.bClasses);

    settings_button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            setContentView(R.layout.settings);
        }
    });
}

}

仅供参考我的应用程序昨晚正在加载..感谢您的帮助,请记住我是Android编程的新手。谢谢。

2 个答案:

答案 0 :(得分:1)

问题出在这里

 home_button = (Button) findViewById(R.id.bHome);
布局文件中的

没有bHome

答案 1 :(得分:0)

问题可能是,您正在使用setContentView()来显示不同的屏幕。您不应该使用此方法更改屏幕,您应该使用不同的活动。

通常,您只在oncreate中为每个活动设置contentView ONCE。

你的R.layout.main布局probabaly不包含'home'按钮,但r.layout.settings布局确实如此。

首先,您要在此行加载主要布局:setContentView(R.layout.main);但由于此布局文件不包含主页按钮,findViewById(R.id.bHome);将返回null。之后,在您的情况下调用此返回值home_button.setOnClickListener();上的方法将导致NullPointerException。

您应该做的是以下内容:

为您的主要布局创建活动:

public class CallistoMainActivity extends Activity {
/** Called when the activity is first created. */
 Button settings_button;
 Button classes_button;
 Button home_button;
 CheckBox notif_cb;
 CheckBox math_cb;
 CheckBox science_cb;
 CheckBox ss_cb;
 CheckBox english_cb;
 CheckBox language_cb;

 boolean notif,math,science,english,ss,language;




 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //main layout
    settings_button = (Button) findViewById(R.id.bSettings);
    classes_button = (Button) findViewById(R.id.bClasses);

    settings_button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            startActivity(new Intent(getApplicationContext(),
                   CallistoSettingsActivity.class));
        }
    });
}

您的设置布局的活动:

public class CallistoSettingsActivity extends Activity {

 Button home_button;
 CheckBox notif_cb;
 CheckBox math_cb;
 CheckBox science_cb;
 CheckBox ss_cb;
 CheckBox english_cb;
 CheckBox language_cb;

 boolean notif,math,science,english,ss,language;

/** Called when the activity is first created. */
 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.settings);


    //settings layout
    notif_cb = (CheckBox) findViewById(R.id.cbNotif);
    math_cb = (CheckBox) findViewById(R.id.cbMath);
    science_cb = (CheckBox) findViewById(R.id.cbScience);
    ss_cb = (CheckBox) findViewById(R.id.cbSS);
    english_cb = (CheckBox) findViewById(R.id.cbEnglish);
    language_cb = (CheckBox) findViewById(R.id.cbLang);
    home_button = (Button) findViewById(R.id.bHome);

    notif = true;
    math = true;
    science = true;
    english = true;
    ss = true;
    language = true;

    home_button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
            //You could either use finish() to finish the current activity, and return to the previous CallistoMainActivity on the stack.
            //Or you could simply start the main activity again by using the startActivity() method you see in the onclicklistener on the settings button.
        }
    });        
}

现在发生的情况是,当您单击主活动中的设置按钮时,将显示设置活动。单击设置活动中的主页按钮时,设置活动将完成,用户将返回到堆栈上的上一个活动;这是主要的活动。 另外,不要忘记在AndroidManifest.xml中定义settingsactivity

编辑:你应该注意的另一件事是,如果第x行出现错误,但代码中的第x行没有任何内容,那么Android设备上运行的代码与您的代码不同在你的编辑器中看着。所以这可能是它昨晚运行的原因,但不再是。