【问题标题】:Kotlin visibility view.gone crashed when clickedKotlin 可见性 view.gone 在单击时崩溃
【发布时间】:2020-05-13 10:11:38
【问题描述】:

我正在为主要活动制作第二个屏幕,第二个屏幕(screen_overlay.xml)类似于弹出式覆盖屏幕,用户可以在按下 textView 时随时关闭它。

我遇到的问题是,每次单击“关闭屏幕”文本时,应用程序总是崩溃。我一直在查看有关此的一些参考资料,但几乎所有解决方案都以应用程序崩溃告终。

我发现的大部分解决方案都是用 Java 编写的,所以我尝试在 Kotlin 中进行调整,但我仍然不确定我在哪里遗漏了什么或者下面的 kotlin 代码有问题。

下面是xml代码,

screen_overlay.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="com.app.testApp.feature.screenView">


<androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/screen_background"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <TextView
            android:id="@+id/textView_close_screen"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:text="CLOSE SCREEN"
            android:clickable="true"
            android:onClick="hideScreen"
            />

</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

下面是kotlin代码,

screenView.kt

import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.app.testApp.R
import kotlinx.android.synthetic.main.screen_overlay.*

class TutorialDialog : AppCompatActivity() {

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

        }

fun hideScreen(v: View?){
        val v:TextView = findViewById(R.id.textView_close_screen)

        v.setOnClickListener{
            screen_background.visibility = View.GONE
        }

    }

}

任何帮助解决此问题的人将不胜感激,谢谢。

【问题讨论】:

  • 您一次又一次地添加点击监听器。 hidescreen 应该只包含 background.visibility = View.GONE
  • @Pavneet_Singh 有什么解释为什么v.setOnClickListener 被多次添加?我也曾尝试删除点击监听器,只使用background.visibility = View.GONE,但它仍然崩溃
  • 您再次找到视图findViewById 并添加了一个新的侦听器v.setOnClickListener,这已经用android:onClick="hideScreen" 完成了
  • 有两个问题。首先,为什么要使用嵌套约束布局。第二:您没有在 Activity Oncreate 方法中调用 hide Screen。
  • R.screen_overlay 是错字吗?因为您应该使用布局参考调用setContentView,即。 R.layout.screen_overlay.

标签: android xml kotlin


【解决方案1】:
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.app.testApp.R
import kotlinx.android.synthetic.main.screen_overlay.*

class TutorialDialog : AppCompatActivity() {

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


        textView_close_screen.setOnClickListener{
            background.visibility = View.GONE
        }
        }


}

【讨论】:

  • 感谢您的回答,我刚刚发现您可以立即在 oncreate 方法中调用 textview。抱歉,问题仍然存在。
  • 现在有什么问题? @丹
  • 问题是我点击textView_close_screen后应用程序仍然崩溃。还有一些让我烦恼的事情,通常是第二个活动覆盖到主要活动上,当点击 textview 时会影响整个应用程序吗?
  • 您可以将按钮置于单独的布局中@Dan
  • 感谢您的回答,我刚刚发现主要问题不在代码上,而在缓存上。它与“无效缓存”有关,在我清除缓存后,代码运行良好。
【解决方案2】:

我假设你想在点击后隐藏视图:

fun hideScreen(v: View) = v.visibility = View.GONE

【讨论】:

  • 是的,这就是我的意图。所以基本上我有一个主要活动,然后第二个活动从覆盖主要活动的主要活动中弹出,我认为不是完全覆盖,但就像堆叠在它上面一样。然后用户可以通过单击关闭屏幕文本视图来隐藏第二个活动/视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多