0

因此,当我尝试在模拟器中运行我的代码时,应用程序后台弹出然后关闭给我对话框,“不幸的是,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>

Java包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 编程新手。谢谢你。

4

2 回答 2

1

问题就在这里

 home_button = (Button) findViewById(R.id.bHome);

在布局文件中没有bHome

于 2012-12-03T06:13:58.573 回答
0

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

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

您的 R.layout.main 布局可能不包含“主页”按钮,但 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.
        }
    });        
}

现在发生的情况是,当您单击主活动中的设置按钮时,将显示设置活动。当点击settings Activity中的home键时,settings Activity结束,用户返回到栈上的前一个Activity;这是主要活动。也不要忘记在你的 AndroidManifest.xml 中定义 settingsactivity

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

于 2012-12-03T07:01:05.797 回答