Android Null指针异常按钮

时间:2011-01-13 10:54:19

标签: android button nullpointerexception

好吧这可能看起来像一个毫无意义的例子,但如果我能弄清楚这一点,那么我想要制作的程序就可以了。所以我有两个活动测试,并用一个按钮测试两个。

测试1:

package thompson.cameron.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class Test extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        View button = findViewById(R.id.testButton);
        button.setOnClickListener(this);
    }

    public void onClick(View v){
     Intent i = new Intent(this, Test2.class);
     startActivity(i);
     }

}

和test2

package thompson.cameron.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class Test2 extends Activity implements OnClickListener {

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

  View test = findViewById(R.id.testButton);
  test.setOnClickListener(this);
 }

 public void onClick(View v){
  switch (v.getId()){
  case R.id.testButton:
   System.exit(1);
  }
 }

}

当我单击Test上的按钮时,它应该启动test2但是此时我得到一个空指针异常,我已经缩小到test.setOnClickListener(this);代码行。下面是我layout的两个xml文件。当我只有一个活动时,我可以让按钮工作,但只要我添加第二个activity并使用不同的layout文件,它就会崩溃

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"
    >
<Button
 android:id="@+id/testButton"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="TEST TEST TEST"/>

</LinearLayout>

main2.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"
    >
<Button
 android:id="@+id/testButton"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="TEST2 TEST2 TEST2"/>

</LinearLayout>

我仍然是Android编程的新手,所以感谢您的帮助。

10 个答案:

答案 0 :(得分:2)

在test.java文件中给出:

implements View.OnClickListener

将按钮初始化为:

Button testButton = (Button) findViewById(R.id.testButton);

并在你的onClick方法中,检查你是否点击了按钮:

if(v == testButton) {
//give ur intent code
}

执行onClick功能有多种方法。 一个是我提到的上述方法。 另一个是ankit提到的。 第三种方式是通过你的布局。

在您的按钮标记的布局中,您可以指定为:

<Button android:id="@+id/testButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Click" android:onClick="onTestButtonClick" />

在课堂上只需提及按钮的以下详细信息:

public void onTestButtonClick(View view) {
     //give your intent code
}

您也可以参考链接: http://android-developers.blogspot.com/2009/10/ui-framework-changes-in-android-16.html

答案 1 :(得分:2)

  1. 打开Debug perspective
  2. 中的Eclipse
  3. 选择“断点”视图选项卡。
  4. 选择“Add Java Exception Breakpoint”并选择 NullPointerException
  5. 使用“Debug As ...”或附加启动activity 调试器通过DDMS运行实例。
  6. 执行违规工作流程。它会破坏那条线 导致NullPointerException

答案 2 :(得分:1)

确保两个活动都在应用程序的清单文件中注册。

作为旁注,请勿在代码中调用System.exit。您可以调用finish()来关闭一个Activity,这将在前面的堆栈上显示上一个Activity。

答案 3 :(得分:1)

这里的问题是你没有对按钮进行类型转换。

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; // Needed to add this import for the button casting below


public class Test extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // I have changed View to Button and then typecasted
        // with the "(Button)" the return of findViewById

        Button button = (Button) findViewById(R.id.testButton);
        button.setOnClickListener(this);
    }

    public void onClick(View v){
        Intent i = new Intent(this, Test2.class);
        startActivity(i);
    }
}

如果您对此有任何疑问,请与我们联系。我刚刚通过主类而不是单独的匿名侦听器使用onClickListener实现完成了我的第一个实验。

安德鲁

答案 4 :(得分:1)

我遇到了同样的问题,你可能会把相同的内容视图放在按钮上, 的setContentView(R.layout.main);如果按钮位于该内容视图中,则在其他情况下,您将放置:

setContentView(R.layout.buttoncontentview);
View button = findViewById(R.id.testButton);
button.setOnClickListener(this);
public void onClick(View v){ 
  Intent i = new Intent(this, Test2.class);
  startActivity(i); 
} 
setContentView(R.layout.main);
抱歉我的英语不好,但我是西班牙语

答案 5 :(得分:1)

实施OnClickListener界面

并设置button.setOnClickListener(this);

并覆盖

public void onClick(View v) {


}

答案 6 :(得分:0)

我认为您的按钮ID在不同的活动中需要有所不同。 R.id.testButton只会指一个按钮。

答案 7 :(得分:0)

你可以试试这个。它可能有用。

package thompson.cameron.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class Test extends Activity{

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

        button = findViewById(R.id.testButton);
        button.setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {

                Intent i=new Intent().setClass(Test.this,Test2.class);
                startActivity(i);

            }
        });
    }



}

答案 8 :(得分:0)

最终的解决方案是你可以修改AndroidManifest.xml文件,我终于在这个链接中解决了我的错误How to register a new activity in AndroidManifest.xml?

答案 9 :(得分:0)

首先在main.xml和main2.xml中修改按钮的ID,如下面的代码所示。

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"
    >
<Button
 android:id="@+id/testButton"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="TEST TEST TEST"/>

</LinearLayout>

main2.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"
    >
<Button
 android:id="@+id/testButton1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="TEST2 TEST2 TEST2"/>

</LinearLayout>

它会抛出nullpointerexception,因为id会相互混淆,所以在你的java文件中使用下面的代码来查找按钮。

在活动1中

Button button = findViewById(R.id.testButton);
button.setOnClickListener(this);

和 在活动2中

Button button = findViewById(R.id.testButton1);
button.setOnClickListener(this);