Почему onClickListener приводит к сбою моего приложения при его запуске?

я новый программист, пытающийся загрузить новое представление, когда я нажимаю кнопку на заставке. Моя заставка - это viewPager с 4 представлениями. У меня есть кнопка на тех представлениях, которые при нажатии я хочу, чтобы представление списка загружалось. Но когда я добавил onClickListener, он вылетает, как только приложение запускается. Я пытался понять это в течение нескольких дней, и теперь я действительно в отчаянии! Заранее спасибо.

Я попытался выяснить, что означает фатальное исключение MAIN, но, похоже, для каждой программы это другая проблема.

public class Splash extends Activity {

ImageButton listButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.splash);

    SplashPager adapter = new SplashPager();
    ViewPager myPager = (ViewPager) findViewById(R.id.splashPager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);

    listButtonListener();
}

public void listButtonListener() {
    listButton = (ImageButton) findViewById(R.id.splashB);
    listButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            startActivity(new Intent("com.example.survtest1.Main"));
        }
    });
}
}

// Журнал сбоев

01-14 22:12:32.069: W/dalvikvm(14733): threadid=1: thread exiting with uncaught exception (group=0x40207560)
01-14 22:12:32.079: E/AndroidRuntime(14733): FATAL EXCEPTION: main
01-14 22:12:32.079: E/AndroidRuntime(14733): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.survtest1/com.example.survtest1.Splash}: java.lang.NullPointerException
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1658)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:942)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.os.Looper.loop(Looper.java:130)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.main(ActivityThread.java:3733)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at java.lang.reflect.Method.invokeNative(Native Method)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at java.lang.reflect.Method.invoke(Method.java:507)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:892)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:650)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at dalvik.system.NativeStart.main(Native Method)
01-14 22:12:32.079: E/AndroidRuntime(14733): Caused by: java.lang.NullPointerException
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.example.survtest1.Splash.listButtonListener(Splash.java:40)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.example.survtest1.Splash.onCreate(Splash.java:31)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
01-14 22:12:32.079: E/AndroidRuntime(14733):    ... 11 more
01-14 22:12:32.079: E/AndroidRuntime(14733): [Blue Error Handler] Make Debugging Report file for main
01-14 22:12:32.079: E/AndroidRuntime(14733): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.survtest1/com.example.survtest1.Splash}: java.lang.NullPointerException
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1658)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:942)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.os.Looper.loop(Looper.java:130)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.main(ActivityThread.java:3733)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at java.lang.reflect.Method.invokeNative(Native Method)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at java.lang.reflect.Method.invoke(Method.java:507)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:892)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:650)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at dalvik.system.NativeStart.main(Native Method)
01-14 22:12:32.079: E/AndroidRuntime(14733): Caused by: java.lang.NullPointerException
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.example.survtest1.Splash.listButtonListener(Splash.java:40)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.example.survtest1.Splash.onCreate(Splash.java:31)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-14 22:12:32.079: E/AndroidRuntime(14733):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
01-14 22:12:32.079: E/AndroidRuntime(14733):    ... 11 more

// манифест

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.survtest1.Splash"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.survtest1.Main"
        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>

// XML-макет

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/splash" 
android:background="#000000" >

<ImageView

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:src="@drawable/intro__1" />

   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="aaaaaaaaaaaaaaaaaa" 
       android:layout_gravity="bottom" 
       android:layout_marginLeft="75dp"
       android:id="@+id/splashB" 
       android:onClick="startActivity" />

</FrameLayout>

Я только что попытался добавить android:onClick, и он все еще падает.


person Jason Cheladyn    schedule 15.01.2013    source источник
comment
у вас есть исключение нулевого указателя в строке 40 Splash.java. Что находится в строке 40??   -  person Robin Chander    schedule 15.01.2013
comment
что это com.example.survtest1.Main это ваш класс активности???   -  person BBdev    schedule 15.01.2013


Ответы (3)


Ваша проблема заключается в следующем:

01-14 22:12:32.079: E/AndroidRuntime(14733): Caused by: java.lang.NullPointerException
01-14 22:12:32.079: E/AndroidRuntime(14733):    at com.example.survtest1.Splash.listButtonListener(Splash.java:40)

Если бы я предположил (поскольку вы не вставили полный исходный код для своей деятельности, я не уверен, какая строка является строкой 40), я бы сказал, что ваша ошибка находится в этой строке:

listButton = (ImageButton) findViewById(R.id.splashB);

В частности, в вашем макете, скорее всего, отсутствует элемент <ImageButton android:id="@+id/splashB" ...>. Таким образом, ваш listButton равен нулю, что приводит к NullPointerException в следующей строке.

Обновление: ваше приложение аварийно завершает работу, потому что, хотя у него есть <Button> с идентификатором splashB, эта кнопка не имеет <ImageButton>, чего ожидает ваш код.

Вы должны либо изменить макет, чтобы использовать <ImageButton>, либо изменить эту строку:

listButton = (ImageButton) findViewById(R.id.splashB);

to:

listButton = (Button) findViewById(R.id.splashB);

Либо должно работать.

person Franci Penov    schedule 15.01.2013
comment
это строка 40 listButton.setOnClickListener (новый OnClickListener() { - person Jason Cheladyn; 15.01.2013
comment
Как это исправить? Почему он нулевой? findViewById использует правильный идентификатор. Большое спасибо ♥ - person Jason Cheladyn; 15.01.2013
comment
Можете ли вы опубликовать свой макет xml в вопросе? - person Franci Penov; 15.01.2013
comment
Извините, я не сказал вам, что изменил кнопку изображения на кнопку после этого сбоя. Это не проблема. ;( - person Jason Cheladyn; 15.01.2013
comment
Кроме того, может быть полезно опубликовать в вашем вопросе точные источники, которые воспроизводят исключение. Исключение, которое у вас есть в выводе logcat, было бы именно тем, что я ожидал бы от опубликованных вами источников. Но если ваши источники изменились после того, как вы нажмете это исключение, все ставки сняты. Вы случайно не меняли и другие вещи? - person Franci Penov; 15.01.2013
comment
Нет, я только изменил его с imageButton на Button, спасибо за совет, я новичок на этом сайте. Я очень ценю это. - person Jason Cheladyn; 15.01.2013
comment
Он все еще говорит, что listButton равен нулю, я не понимаю. - person Jason Cheladyn; 15.01.2013
comment
Поскольку исходный код в вопросах прямо сейчас, код ожидает ImageButton, файл макета имеет Button. Вы не можете преобразовать Button в ImageButton, поэтому строка 39 будет приводить к тому, что listButton будет нулевым. Это ошибка в исходном коде вопроса. Если у вас есть другой исходный код, который по-прежнему выдает ту же ошибку, единственный способ получить другой ответ — опубликовать этот исходный код. - person Franci Penov; 16.01.2013

Я могу предположить, но я думаю, что ваша настоящая проблема заключается в этом фрагменте кода

public void onClick(View arg0) {
     startActivity(new Intent("com.example.survtest1.Main"));
}

Здесь вы начинаете новый Activity с действием, но вы не даете действительный Action. Поэтому, если вы хотите начать новую деятельность там, вы должны передать Context и your valid class name. Или, если вы начинаете Activity с Action, убедитесь, что вы начинаете valid action.

Ознакомьтесь с разделом Начало другого действия и этим Начать действие с помощью пользовательского действия.

person BBdev    schedule 15.01.2013
comment
Activity.startActivity не нуждается в Context, так как само действие является контекстом. Кроме того, действия с намерениями являются просто строкой, и пока есть какой-либо .apk, который объявляет действие с фильтром намерений с той же строкой, он действителен. - person Franci Penov; 15.01.2013
comment
он может не определить свое пользовательское действие в файле манифеста или может не определить там активность. - person BBdev; 15.01.2013
comment
Если не объявлена ​​активность, которая слушает это действие, startActivity ничего не сделает. Это не вызовет исключение NullPointerException. - person Franci Penov; 15.01.2013
comment
‹action android:name=com.example.survtest1.Main android:label=@string/app_name › ‹intent-filter› ‹action android:name=android.intent.action.MAIN /› ​​‹category android:name=android. намерение.категория.LAUNCHER /› ‹/фильтр намерений› ‹/активность› - person Jason Cheladyn; 15.01.2013

listButton = (ImageButton) findViewById(R.id.splashB); здесь он не ссылается на правильный идентификатор. По моему мнению, либо splashB ссылается на что-то еще, кроме кнопки изображения, либо он не создан. Поэтому проверьте внутри xml-файла или вставьте свой xml, чтобы я мог определить основные причины ошибки.

person Vsw10    schedule 15.01.2013
comment
Спасибо, я разместил xml, я изменил его с imageBtn на обычный btn. - person Jason Cheladyn; 15.01.2013
comment
теперь сделайте аналогичные изменения в вашем коде. После изменений очистите и запустите код - person Vsw10; 15.01.2013
comment
и дайте мне знать о вашем logcat ?? - person Vsw10; 15.01.2013
comment
прокомментируйте эти строки, а затем еще раз очистите и запустите ViewPager myPager = (ViewPager) findViewById(R.id.splashPager); myPager.setAdapter (адаптер); мой пейджер.setCurrentItem (0); - person Vsw10; 15.01.2013
comment
все еще получаю (Splash.java.40) сбой: 9 тьфу, я не понимаю. Думаю, мне просто придется переделать весь проект по-другому. - person Jason Cheladyn; 15.01.2013
comment
те же журналы, которые вы получаете и в этот раз, или что-то другое.. Сделайте мне одолжение, пожалуйста, вставьте последние журналы.. - person Vsw10; 15.01.2013
comment
Те же точные журналы, это как-то связано с onClickListener, он говорит, что listButton равен нулю. Я не понимаю, почему он нулевой. - person Jason Cheladyn; 15.01.2013
comment
Вы изменили тип listButton с ImageButton на кнопку? - person Vsw10; 15.01.2013
comment
просто проверьте еще раз свой setContentView . Убедитесь, что вы указали правильный xml или нет. Я изучил вашу проблему и пришел к выводу, что исключение может быть связано либо с setContentView, либо с findViewById. Просто обратите внимание на эти две вещи.. - person Vsw10; 15.01.2013
comment
ViewPager myPager = (ViewPager) findViewById(R.id.splashPager); где вы упомянули об этом. Потому что в предоставленном вами xml он не виден. И он должен давать исключение, но не давать его. Итак, это означает, что макет, предоставленный вами внутри setContentView, является другим и не использует макет, где вы определили кнопку . - person Vsw10; 15.01.2013