保存提交的条款和条件作为Android Studio中的首选项?

j2qf4p5b  于 12个月前  发布在  Android
关注(0)|答案(2)|浏览(101)

我试图实现一个应用程序的“条款和条件”屏幕,当用户第一次打开应用程序时弹出。当他们接受条款和条件时,他们继续使用应用程序。如果他们拒绝,应用程序将自动关闭。我添加了一个TextView到一个ScrollView和2个按钮。当用户一路向下滚动到底部时,两个按钮被启用,他们可以选择下一步要做什么。

package com.example.termsandconditionsview

import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.view.ViewTreeObserver
import android.widget.Button
import android.widget.ScrollView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity(), View.OnTouchListener, ViewTreeObserver.OnScrollChangedListener {

    private var svMain: ScrollView? = null
    private lateinit var buttonAccept: Button
    private lateinit var buttonDecline: Button

    private lateinit var sharedPref: SharedPreferences

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

        svMain = findViewById(R.id.scrollView2)
        svMain?.viewTreeObserver?.addOnScrollChangedListener(this)
        buttonAccept = findViewById(R.id.button_accept)
        buttonDecline = findViewById(R.id.button_decline)

        sharedPref = getSharedPreferences("myAppPrefs", Context.MODE_PRIVATE)

        val termsAccepted = sharedPref.getBoolean("terms_accepted", false)
        if (termsAccepted) {
            setContentView(R.layout.activity_main)
        } else {
            setContentView(R.layout.terms_and_conditions_view)
        }
    }

    override fun onScrollChanged() {
        svMain?.let { scrollView ->
            val view = scrollView.getChildAt(scrollView.childCount - 1) as View
            val bottomDetector = view.bottom - (scrollView.height + scrollView.scrollY)

            if (bottomDetector <= 0) {
                buttonAccept.isEnabled = true
                buttonDecline.isEnabled = true
            } else {
                buttonAccept.isEnabled = false
                buttonDecline.isEnabled = false
            }
            buttonAccept.setOnClickListener {
                // Update the termsAccepted value to true in SharedPreferences
                val editor = sharedPref.edit()
                editor.putBoolean("terms_accepted", true)
                editor.apply()

                val textAcceptTac = getString(R.string.txt_accept_tac)
                val duration = Toast.LENGTH_LONG
                val toastAccept = Toast.makeText(this, textAcceptTac, duration)
                toastAccept.show()

                setContentView(R.layout.activity_main)
                // Proceed with the app as the user has accepted the terms&conditions
            }
            buttonDecline.setOnClickListener{
                val textDeclineTac = getString(R.string.txt_decline_tac)
                val duration = Toast.LENGTH_LONG
                val toastDecline = Toast.makeText(this, textDeclineTac, duration)
                toastDecline.show()
                // Close app when user clicks the "Decline" button.
                finish()
            }
        }
    }

    override fun onTouch(p0: View?, p1: MotionEvent?): Boolean {
        TODO("Not yet implemented")
    }
}

现在的问题是我的偏好部分有问题。在我添加之前,按钮禁用/启用工作,以及On.Click事件侦听器。在添加了首选项的代码之后,什么都不起作用了。
我不知道有什么问题。有人能帮帮我吗?Thanks!:)

nnt7mjpx

nnt7mjpx1#

你设置了两次setContentView()。这意味着在该行之前初始化的所有视图都将为空。

separate method to initialize the layout views and listeners

class MainActivity : AppCompatActivity(), View.OnTouchListener, ViewTreeObserver.OnScrollChangedListener {

    private var svMain: ScrollView? = null
    private lateinit var buttonAccept: Button
    private lateinit var buttonDecline: Button
    private lateinit var sharedPref: SharedPreferences

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

        sharedPref = getSharedPreferences("myAppPrefs", Context.MODE_PRIVATE)
        val termsAccepted = sharedPref.getBoolean("terms_accepted", false)

        if (termsAccepted) {
            setContentView(R.layout.activity_main)
        } else {
            setContentView(R.layout.terms_and_conditions_view)
            initializeViewsAndListeners()
        }
    }

    private fun initializeViewsAndListeners() {
        svMain = findViewById(R.id.scrollView2)
        svMain?.viewTreeObserver?.addOnScrollChangedListener(this)
        buttonAccept = findViewById(R.id.button_accept)
        buttonDecline = findViewById(R.id.button_decline)

        buttonAccept.setOnClickListener {
            // Update the termsAccepted value to true in SharedPreferences
            val editor = sharedPref.edit()
            editor.putBoolean("terms_accepted", true)
            editor.apply()

            val textAcceptTac = getString(R.string.txt_accept_tac)
            Toast.makeText(this, textAcceptTac, Toast.LENGTH_LONG).show()

            setContentView(R.layout.activity_main)
        }

        buttonDecline.setOnClickListener {
            val textDeclineTac = getString(R.string.txt_decline_tac)
            Toast.makeText(this, textDeclineTac, Toast.LENGTH_LONG).show()
            finish()
        }
    }

    override fun onScrollChanged() {
        svMain?.let { scrollView ->
            val view = scrollView.getChildAt(scrollView.childCount - 1) as View
            val bottomDetector = view.bottom - (scrollView.height + scrollView.scrollY)

            if (bottomDetector <= 0) {
                buttonAccept.isEnabled = true
                buttonDecline.isEnabled = true
            } else {
                buttonAccept.isEnabled = false
                buttonDecline.isEnabled = false
            }
        }
    }

    override fun onTouch(p0: View?, p1: MotionEvent?): Boolean {
        TODO("Not yet implemented")
    }
}
ecr0jaav

ecr0jaav2#

正如Hezy Ziv所说,我设置了两次内容视图,这毫无意义。
下面是我提出的解决方案,它现在以我希望的方式工作:

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

    sharedPref = getSharedPreferences("myAppPrefs", Context.MODE_PRIVATE)

    val termsAccepted = sharedPref.getBoolean("terms_accepted", false)
    if (termsAccepted) {
        setContentView(R.layout.activity_main)
    } else {
        setContentView(R.layout.terms_and_conditions_view)
        svMain = findViewById(R.id.scrollView2)
        svMain?.viewTreeObserver?.addOnScrollChangedListener(this)
        buttonAccept = findViewById(R.id.button_accept)
        buttonDecline = findViewById(R.id.button_decline)
    }
}

相关问题