Kotlin Приложение, нажмите на кнопку, чтобы открыть новое действие -> IllegalStateException: findViewById не должен быть нулевым - PullRequest
0 голосов
/ 31 января 2020

Я работаю с этим "Bock" Learn Kotlin for Android Development "и дошел до главы 9. У меня сейчас 2 занятия У MainActivity есть строка меню вверху с информационной кнопкой. Эта кнопка должна открыть StatisticsActiv .

MainActivity.kt использует функцию с именем onOptionsItemSelected , которая должна вызываться после нажатия на информацию. кнопка в строке меню и, таким образом, функция «openStatistics», которая запишет действие в намерении. Но этого не происходит ... вместо этого я получаю Исключение: java .lang.IllegalStateException: findViewById (statisticsContainer) не должен быть нулевым (полное исключение показано ниже)

AndroidManifext. xml

<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=".StatisticsActivity" />
    <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</application>

MainActivity.kt

class MainActivity : AppCompatActivity() {
    val rnd: RandomNumberGenerator = StdRandom()
    // or ... = RandomRandom()
    var started = false
    var number = 0
    var tries = 0
    var gameUser = GameUser(
        lastName = "Doe",
        firstName = "John",
        userName = "jdoe",
        birthday = "1900-01-01",
        registrationNumber = 0,
        userRank = 0.0
    )

    override
    fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        fetchSavedInstanceData(savedInstanceState)
        doGuess.setEnabled(started)
    }

    override
    fun onCreateOptionsMenu(menu: Menu): Boolean {
        val inflater: MenuInflater = menuInflater
        inflater.inflate(R.menu.menu_options, menu)
        return true
    }

    override
    fun onOptionsItemSelected(item: MenuItem): Boolean {
        val statisticsContainer = R.id.statisticsContainer
        val displayTextView: TextView = findViewById(statisticsContainer)
        openStatistics()
        displayTextView.text = "TEST"
        return super.onOptionsItemSelected(item)
    }

    private fun openStatistics() {
        val intent = Intent(this, StatisticsActivity::class.java)
        startActivity(intent)
    }

    override
    fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        putInstanceData(outState)
    }

}

Я подумал, что если я нажму кнопку информации в меню bar, она должна использовать функцию «onOptionsItemSelected» и, таким образом, функцию «openStatistics», которая запишет действие в намерении.

menue_options. xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/statistics"
        android:icon="@android:drawable/ic_menu_info_details"
        android:title="@string/statistics.menu_title"
        app:showAsAction="ifRoom" />
</menu>

StatisticsActivity.kt onCreate function

override
    fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_statistics)

        restoreData(savedInstanceState)
        showData(Statistics.getStatistics())
    }

the макет контейнера статистики: activity_statistics. xml


<?xml version="1.0" encoding="utf-8"?>
<TextView
    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:id="@+id/statisticsContainer"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".StatisticsActivity">
</TextView>

Исключение после нажатия кнопки информации

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: kotlinforandroid.book.numberguess, PID: 5201
    java.lang.IllegalStateException: findViewById(statisticsContainer) must not be null
        at kotlinforandroid.book.numberguess.MainActivity.onOptionsItemSelected(MainActivity.kt:55)
        at android.app.Activity.onMenuItemSelected(Activity.java:3450)
        at androidx.fragment.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:384)
        at androidx.appcompat.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:219)
        at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
        at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
        at androidx.appcompat.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:64)
        at androidx.appcompat.widget.Toolbar$1.onMenuItemClick(Toolbar.java:207)
        at androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:781)
        at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
        at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:981)
        at androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:625)
        at androidx.appcompat.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:151)
        at android.view.View.performClick(View.java:6294)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Ответы [ 3 ]

0 голосов
/ 31 января 2020

раствор

override
fun onOptionsItemSelected(item: MenuItem): Boolean {
    openStatistics()
    return super.onOptionsItemSelected(item)
}

private fun openStatistics() {
    val intent = Intent(this, StatisticsActivity::class.java)
    startActivity(intent)
}
0 голосов
/ 01 февраля 2020

Я думаю, вам просто нужно добавить TextView внутри TextView того, что вы создали, а затем установить id в секунду TextView:

<TextView
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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".StatisticsActivity">

  <TextView
  android:id="@+id/statisticsContainer"
  android:layout_width="match_parent"
  android:orientation="vertical"
  android:layout_height="match_parent">

  </TextView>

</TextView>

Это должно помочь вам.

0 голосов
/ 31 января 2020

Попробуйте это:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        R.id.statistics -> {
            openStatistics()
            displayTextView.text = "TEST"
            return true
        }
    }
    return super.onOptionsItemSelected(item)
}
...