Java Android应用程序在多次切换片段时崩溃

Java Android应用程序在多次切换片段时崩溃,java,android,android-layout,android-fragments,kotlin,Java,Android,Android Layout,Android Fragments,Kotlin,正如你已经从标题中看到的,当我在片段/标签之间切换时,我的应用程序正在崩溃。我有3个标签,如果我在第一个和第二个标签之间切换,乘以没有发生任何事情,如果我在第三个和第二个标签之间切换,或者在第三个和第二个标签之间切换,或者在第三个到第二个标签之间切换,应用程序崩溃 如果需要更多的代码和异常,请告诉我 例外情况: E/AndroidRuntime: FATAL EXCEPTION: main Process: de.noel.networkscanner, PID: 8493 java.lang.

正如你已经从标题中看到的,当我在片段/标签之间切换时,我的应用程序正在崩溃。我有3个标签,如果我在第一个和第二个标签之间切换,乘以没有发生任何事情,如果我在第三个和第二个标签之间切换,或者在第三个和第二个标签之间切换,或者在第三个到第二个标签之间切换,应用程序崩溃

如果需要更多的代码和异常,请告诉我

例外情况:

E/AndroidRuntime:
FATAL EXCEPTION: main
Process: de.noel.networkscanner,
PID: 8493
java.lang.IllegalArgumentException:
Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, Parameter view
at de.noel.networkscanner.ui.main.FragmentDownlaod$registerListener$1.onItemSelected(Unknown
Source:7)
at android.widget.AdapterView.fireOnSelected(AdapterView.java:1366)
at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:1355)
at android.widget.AdapterView.selectionChanged(AdapterView.java:1339)
at android.widget.AdapterView.checkSelectionChanged(AdapterView.java:1530)
at android.widget.AdapterView.handleDataChanged(AdapterView.java:1506)
at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:191)
at android.widget.Spinner.onMeasure(Spinner.java:631)
at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:428)
at android.view.View.measure(View.java:24966)
at android.widget.GridLayout.measureChildWithMargins2(GridLayout.java:1018)
at android.widget.GridLayout.measureChildrenWithMargins(GridLayout.java:1028)
at android.widget.GridLayout.onMeasure(GridLayout.java:1067)
at android.view.View.measure(View.java:24966)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:978)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:24966)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1638)
at android.view.View.measure(View.java:24966)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:978)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:24966)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:24966)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:24966)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:24966)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:24966)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:992)
at android.view.View.measure(View.java:24966)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3301)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2028)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2330)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1888)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8511)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7050)
at java.lang.reflect.Method.invoke(Native
Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
我的片段类:

片段/选项卡这不是整个类: 片段/选项卡这不是完整的类: 片段/选项卡:

class FragmentConverter : Fragment {
constructor() : super()

private lateinit var myView: View


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    this.myView = inflater.inflate(R.layout.converter_fragement, container, false)
    return this.myView
}
编辑:添加了registerListener方法:

private fun registerListener() {

        textEditSize.addTextChangedListener(TextChangeWatcher(textEditSize))
        textEditSpeed.addTextChangedListener(TextChangeWatcher(textEditSpeed))

        sizeSpinner.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>,
                view: View,
                position: Int,
                id: Long
            ) {
                when (position) {
                    0 -> selectedSizeForDownloadSize = DataSizeNumbers.BIT
                    1 -> selectedSizeForDownloadSize = DataSizeNumbers.KILO
                    2 -> selectedSizeForDownloadSize = DataSizeNumbers.MEGA
                    3 -> selectedSizeForDownloadSize = DataSizeNumbers.GIGA
                    4 -> selectedSizeForDownloadSize = DataSizeNumbers.TERRA
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>) {
                selectedSizeForDownloadSize = DataSizeNumbers.KILO
            }
        })

        speedSpinner.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>,
                view: View,
                position: Int,
                id: Long
            ) {
                when (position) {
                    0 -> selectedSizeForDownloadSpeed = DataSizeNumbers.BIT
                    1 -> selectedSizeForDownloadSpeed = DataSizeNumbers.KILO
                    2 -> selectedSizeForDownloadSpeed = DataSizeNumbers.MEGA
                    3 -> selectedSizeForDownloadSpeed = DataSizeNumbers.GIGA
                    4 -> selectedSizeForDownloadSpeed = DataSizeNumbers.TERRA
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>) {
                selectedSizeForDownloadSpeed = DataSizeNumbers.KILO
            }
        })

        calcBtn.setOnClickListener {


            if (editTextIncludesNumbers(textEditSize)) {

                if (editTextIncludesNumbers(textEditSpeed)) {


                    speedResultView.text = Calculator.calculateTime(
                        getNumberFromField(textEditSize),
                        selectedSizeForDownloadSize,
                        sizeInBit,
                        getNumberFromField((textEditSpeed)),
                        selectedSizeForDownloadSpeed,
                        speedInBit
                    )

                } else {
                    speedResultView.text = getString(R.string.noCorrectNumber_speed)
                }

            } else {
                Log.d("edit", "is empty -> ${getString(R.string.noCorrectNumber_size)}")
                speedResultView.text = getString(R.string.noCorrectNumber_size)
            }


        }
        sizeBitByteSwitcher.setOnCheckedChangeListener { _, _ ->
            sizeInBit = !sizeInBit
            updateSpinnerItems()
        }

        speedBitByteSwitcher.setOnCheckedChangeListener { _, _ ->
            speedInBit = !speedInBit
            updateSpinnerItems()
        }
    }  
将OnItemSelectedListeners中的view:view更改为nullable view:view


它是一个框架java接口,具有未指定的空性,因此kotlin编译器允许您使用不同的非空类型实现该接口。但是,在运行时,可以使用null参数调用该函数,当kotlin运行时检查您的非null实际上不为null时,会导致此崩溃。

堆栈跟踪显示它发生在FragmentDownload.registerListener中,因此您可以发布类的该部分吗?你的应用程序中的其他片段是不相关的。我添加了方法问题在parent:AdapterView,view:view,position:Int,id:Long中。出于某种原因,我认为视图是空的。好的,你知道如何防止崩溃吗?
class FragmentConverter : Fragment {
constructor() : super()

private lateinit var myView: View


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    this.myView = inflater.inflate(R.layout.converter_fragement, container, false)
    return this.myView
}
private fun registerListener() {

        textEditSize.addTextChangedListener(TextChangeWatcher(textEditSize))
        textEditSpeed.addTextChangedListener(TextChangeWatcher(textEditSpeed))

        sizeSpinner.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>,
                view: View,
                position: Int,
                id: Long
            ) {
                when (position) {
                    0 -> selectedSizeForDownloadSize = DataSizeNumbers.BIT
                    1 -> selectedSizeForDownloadSize = DataSizeNumbers.KILO
                    2 -> selectedSizeForDownloadSize = DataSizeNumbers.MEGA
                    3 -> selectedSizeForDownloadSize = DataSizeNumbers.GIGA
                    4 -> selectedSizeForDownloadSize = DataSizeNumbers.TERRA
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>) {
                selectedSizeForDownloadSize = DataSizeNumbers.KILO
            }
        })

        speedSpinner.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>,
                view: View,
                position: Int,
                id: Long
            ) {
                when (position) {
                    0 -> selectedSizeForDownloadSpeed = DataSizeNumbers.BIT
                    1 -> selectedSizeForDownloadSpeed = DataSizeNumbers.KILO
                    2 -> selectedSizeForDownloadSpeed = DataSizeNumbers.MEGA
                    3 -> selectedSizeForDownloadSpeed = DataSizeNumbers.GIGA
                    4 -> selectedSizeForDownloadSpeed = DataSizeNumbers.TERRA
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>) {
                selectedSizeForDownloadSpeed = DataSizeNumbers.KILO
            }
        })

        calcBtn.setOnClickListener {


            if (editTextIncludesNumbers(textEditSize)) {

                if (editTextIncludesNumbers(textEditSpeed)) {


                    speedResultView.text = Calculator.calculateTime(
                        getNumberFromField(textEditSize),
                        selectedSizeForDownloadSize,
                        sizeInBit,
                        getNumberFromField((textEditSpeed)),
                        selectedSizeForDownloadSpeed,
                        speedInBit
                    )

                } else {
                    speedResultView.text = getString(R.string.noCorrectNumber_speed)
                }

            } else {
                Log.d("edit", "is empty -> ${getString(R.string.noCorrectNumber_size)}")
                speedResultView.text = getString(R.string.noCorrectNumber_size)
            }


        }
        sizeBitByteSwitcher.setOnCheckedChangeListener { _, _ ->
            sizeInBit = !sizeInBit
            updateSpinnerItems()
        }

        speedBitByteSwitcher.setOnCheckedChangeListener { _, _ ->
            speedInBit = !speedInBit
            updateSpinnerItems()
        }
    }