Получение NullPointerException при попытке изменить фоновый ресурс кнопки с помощью цикла FOR - PullRequest
0 голосов
/ 06 марта 2020

В основном приложение может работать, и все, пока я не вставил любой из кодов

  • clickableViews[i].setBackgroundResource(ant)
  • clickableViews[i].text = "cardback"
  • clickableViews[i].textSize = 0.0F

в течение 1 oop

for (i in 0..15){}

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

.kt файл:

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import com.example.betaberry.databinding.FragmentGameBinding
import kotlinx.android.synthetic.main.fragment_game.*
import  com.example.betaberry.R.drawable.*

class GameFragment : Fragment() {
 override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {

        val binding = DataBindingUtil.inflate<FragmentGameBinding>(inflater,
            R.layout.fragment_game,container,false)


        val pictures: MutableList<Int> = mutableListOf(
            ant, gab, meg, dam, dyl, wp, me, kek, ant, gab, meg, dam, dyl, wp, me, kek)

//These squares are buttons in an array
        val clickableViews = arrayOf(
            square1, square2, square3, square4, square5, square6, square7, square8,
            square9, square10, square11, square12, square13, square14, square15, square16) 


        val cardBack = cardback
        var clickCount = 0
        var turnOver = false
        var lastClicked = -1


        pictures.shuffle()

        for (i in 0..15){

            clickableViews[i].setBackgroundResource(ant)
//if everything below this is removed (except "return binding.root"), the NullPointerException points to this line
            clickableViews[i].text = "cardback"
            clickableViews[i].textSize = 0.0F

clickableViews[i].setOnClickListener {
                if (clickableViews[i].text == "cardback" && !turnOver) {
                    clickableViews[i].setBackgroundResource(pictures[i])
                    clickableViews[i].setText(pictures[i])
                    if (clickCount == 0) {
                        lastClicked = i
                    }
                    clickCount++
                }

                else if (clickableViews[i].text !in "cardback") {
                    clickableViews[i].setBackgroundResource(cardBack)
                    clickableViews[i].text = "cardback"
                    clickCount--
                }

                if (clickCount == 2) {
                    turnOver = true
                    if (clickableViews[i].text == clickableViews[lastClicked].text) {
                        clickableViews[i].isClickable = false
                        clickableViews[lastClicked].isClickable = false
                        turnOver = false
                        clickCount = 0
                    }
                }

                else if (clickCount == 0) {
                    turnOver = false
                }
            } //setOnClickListener end

        } //for loop end

        return binding.root

    } //onCreateView end


} //GameFragment end

Ошибка Logcat:

2020-03-07 21:19:10.613 5547-5547/com.example.betaberry E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.betaberry, PID: 5547
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setBackgroundResource(int)' on a null object reference
        at com.example.betaberry.GameFragment.onCreateView(GameFragment.kt:67)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
        at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

Большая часть кода, который я использовал, следует из этого видеоурока:

https://www.youtube.com/watch?v=BGvjScKcW1s

1 Ответ

0 голосов
/ 15 марта 2020

Проблема в том, что View не устанавливается до тех пор, пока не выполнится onCreateView, что означает, что кнопки еще не доступны через syntheti c import kotlinx.android.synthetic.main.fragment_game.*. Есть два возможных решения.

Доступ к Button с помощью переменной binding

Например, используйте binding.square1 для доступа к этому Button.

Получите доступ к Button s через импорт syntheti c в onStart

Чтобы получить доступ к Button s через переопределение импорта syntheti c onStart и поместите туда логи c , Обратите внимание, что onCreateView для Fragment отличается от onCreate для Activity.

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import com.example.betaberry.databinding.FragmentGameBinding
import kotlinx.android.synthetic.main.fragment_game.*
import com.example.betaberry.R.drawable.*

class GameFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {

        val binding = DataBindingUtil.inflate<FragmentGameBinding>(inflater,
            R.layout.fragment_game,container,false)

        return binding.root
    } //onCreateView end

    override fun onStart() {
        super.onStart()

        val pictures: MutableList<Int> = mutableListOf(
            ant, gab, meg, dam, dyl, wp, me, kek, ant, gab, meg, dam, dyl, wp, me, kek)

        //These squares are buttons in an array
        val clickableViews = arrayOf(
            square1, square2, square3, square4, square5, square6, square7, square8,
            square9, square10, square11, square12, square13, square14, square15, square16) 

        val cardBack = cardback
        var clickCount = 0
        var turnOver = false
        var lastClicked = -1

        pictures.shuffle()

        for (i in 0..15){
            clickableViews[i].setBackgroundResource(ant)
            clickableViews[i].text = "cardback"
            clickableViews[i].textSize = 0.0F

            clickableViews[i].setOnClickListener {
                if (clickableViews[i].text == "cardback" && !turnOver) {
                    clickableViews[i].setBackgroundResource(pictures[i])
                    clickableViews[i].setText(pictures[i])
                    if (clickCount == 0) {
                        lastClicked = i
                    }
                    clickCount++
                }

                else if (clickableViews[i].text !in "cardback") {
                    clickableViews[i].setBackgroundResource(cardBack)
                    clickableViews[i].text = "cardback"
                    clickCount--
                }

                if (clickCount == 2) {
                    turnOver = true
                    if (clickableViews[i].text == clickableViews[lastClicked].text) {
                        clickableViews[i].isClickable = false
                        clickableViews[lastClicked].isClickable = false
                        turnOver = false
                        clickCount = 0
                    }
                }

                else if (clickCount == 0) {
                    turnOver = false
                }
            } //setOnClickListener end

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