Кнопка исключения нулевого указателя в Android - PullRequest
0 голосов
/ 13 января 2011

Хорошо, это может показаться бессмысленным примером, но если я смогу это выяснить, тогда программа, которую я пытаюсь создать, будет работать. Итак, у меня есть два упражнения: тестирование и тестирование двух с помощью одной кнопки.

Тест 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); строки кода. Ниже приведены мои два xml-файла для layout. Я могу заставить кнопку работать, когда у меня есть только одно действие, но как только я добавляю второй 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 ]

2 голосов
/ 26 октября 2011
  1. Откройте Debug perspective в Eclipse
  2. Выберите вкладку представления «Точки останова».
  3. Выберите «Add Java Exception Breakpoint» и выберите NullPointerException.
  4. Запустите activity либо с помощью «Отладка как ...», либо подключив отладчик к работающему экземпляру через DDMS.
  5. Выполните рабочий процесс, нарушающий работу.Это сломается на линии, которая вызвала NullPointerException.
2 голосов
/ 13 января 2011

В вашем файле test.java введите:

implements View.OnClickListener

Инициализируйте свою кнопку как:

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

и в методе onClick проверьте, нажимаете ли вы кнопку:

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

Существуют различные способы выполнения функций onClick.Одним из них является вышеупомянутый метод, который я упомянул.Другой - то, что упомянул Анкит.Третий путь - через макет.

Внутри макета для тега кнопки вы можете указать:

<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 голос
/ 07 марта 2013

Реализация OnClickListener интерфейса

и установка button.setOnClickListener(this);

и переопределение

public void onClick(View v) {


}
1 голос
/ 20 января 2012

У меня была та же проблема, вы можете поставить тот же вид контента, что и кнопка, 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);

извините за мой плохой английский, но я испанец

1 голос
/ 22 августа 2011

Проблема в том, что вы не настраивали свои виды на кнопки.

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 через основной класс вместо отдельных анонимных слушателей.

Andrew

1 голос
/ 13 января 2011

Убедитесь, что оба действия зарегистрированы в файле манифеста приложения.

В качестве примечания никогда не вызывайте System.exit в своем коде.Вы можете вызвать finish (), чтобы закрыть Activity, и это принесет предыдущую активность в стек.

0 голосов
/ 23 октября 2013

Прежде всего, в main.xml и main2.xml измените идентификаторы кнопки, как показано ниже.

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 из-за конфликта идентификаторов друг с другом, поэтому в вашем Java-файле используйте следующий код для поиска кнопки.

В занятии 1

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

и В занятии 2

Button button = findViewById(R.id.testButton1);
button.setOnClickListener(this);
0 голосов
/ 20 января 2012

Окончательное решение заключается в том, что вы можете изменить файл AndroidManifest.xml. Я наконец-то решил свою ошибку в этой ссылке Как зарегистрировать новое действие в AndroidManifest.xml?

0 голосов
/ 13 января 2011

Вы можете попробовать это. Это может сработать.

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);

            }
        });
    }



}
0 голосов
/ 13 января 2011

Я думаю, ваши идентификаторы кнопок должны быть разными в разных действиях. R.id.testButton будет ссылаться только на одну кнопку.

...