Использование setOnClickListener и получение «Potential NullPointerException». Ресурс отсутствует в некоторых версиях макета - PullRequest
2 голосов
/ 03 апреля 2019

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

В logcat мне выдается эта ошибка:

2019-04-02 16: 03: 26.184 6592-6592 / com.example.swoosh E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: главная Процесс: com.example.swoosh, PID: 6592 java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.example.swoosh / com.example.swoosh.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.Button.setOnClickListener (android.view.View $ OnClickListener)» на нулевую ссылку на объект

Если я уберу часть кода setOnClickListener, программа запустится. Вот раздел кода, который вызывает ошибку. Ниже я опубликую раздел макета XML, в котором расположена кнопка переключения.

Я использую Android Studio 3.3.2 Чего мне здесь не хватает?

    getStartedBtn.setOnClickListener {
        val leagueIntent=Intent(this, leagueActivity::class.java)
        startActivity(leagueIntent)
    }


<Button android:text="@string/get_started"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            app:fontFamily="@font/montserrat"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"
            android:id="@+id/getStartedBtn" android:typeface="normal" android:textSize="14sp"
            android:textColor="@color/colorAccent" android:background="@drawable/swoosh_button"
            android:layout_marginBottom="24dp" app:layout_constraintBottom_toBottomOf="parent"
            android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/textView3"
            app:layout_constraintHorizontal_bias="0.0" app:layout_constraintVertical_bias="0.929" />

//this is full welcomeActivity.kt file
package com.example.swoosh
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_welcome.*

class MainActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_welcome)   
    getStartedBtn.setOnClickListener {
      startActivity(Intent(this, LeagueActivity::class.java))
    }
   }
}
Side note: the "getStartedBtn" is highlighed yellow and when I hold mouse over it, it says "Potential Null Pointer exception.  The resource is missing in some of layout versions"

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.swoosh">

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
    <activity android:name=".LeagueActivity">
    </activity>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts"/>
</application>

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

MainActivity.kt

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getStartedBtn.setOnClickListener {
            startActivity(Intent(this, LeagueActivity::class.java))
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/getStartedBtn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="24dp"
        android:text="@string/get_started"
        android:textColor="@color/colorAccent"
        android:textSize="14sp"
        android:typeface="normal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintVertical_bias="0.929" />

</android.support.constraint.ConstraintLayout>

Не забудьте объявить LeagueActivity на AndroidManifest

<activity android:name=".LeagueActivity" />
1 голос
/ 03 апреля 2019

Я получил это работает.Я изменил две вещи, не уверен, что это сделал, но я запустил программу, и она работала:

  1. Я изменил имя моего файла "welcomeActivity.kt" на caps "WelcomeActivity.kt" в соответствии сРанее предложение Бруно Диего Мартинса об использовании заглавных букв в именах файлов.

  2. Я заметил, что у одного из моих файлов макета была копия.Файл имел то же имя, что и мой activity_welcome.xml, за исключением того, что в конце он имел (16).Я посмотрел на этот файл и заметил, что кнопка переключения для этого макета имеет другой идентификатор имени.Возможно, setOnClickListener пытался использовать этот (16) файл с неправильным именем кнопки вместо исходного файла, в котором я работал, с правильным именем getStartedBtn.Поэтому я удалил файл, который имел (16) в конце.Затем я запустил программу, и она сработала.

Спасибо всем за помощь.Это был мой первый пост здесь, и я был удивлен (приятно удивлен), как быстро люди предложили свою помощь.Большое сообщество здесь.

0 голосов
/ 03 апреля 2019

Убедитесь, что кнопка с same ID существует как в книжной, так и в альбомной ориентации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...