Почему моя попытка заснеженного AlertDialog препятствует отображению моего Activity? - PullRequest
0 голосов
/ 19 июня 2020

Я пишу приложение, которое подключается к устройству bluetooth, поэтому, очевидно, одно из первых действий, которое нужно сделать, - это проверить, есть ли у меня необходимые разрешения при запуске, когда приложение пытается подключиться.

Мое намерение было чтобы предоставить предупреждение, объясняющее, почему необходимы разрешения, с помощью AlertDialog, прежде чем предлагать пользователю их предоставить. Однако пользовательский интерфейс не отображается, если я не сделаю это в другом потоке, и даже тогда я не вижу AlertDialog

. Ниже показано, как я все это делаю (с одним разрешением для краткость). Почему у меня не отображается предупреждение и почему он не позволяет отображать пользовательский интерфейс при вызове после setContentView()? Я получаю все отзывы Log.i(), и они повторяются каждые 2 секунды без предупреждения. Что мне делать в этом случае?

class ConnectDeviceActivity : AppCompatActivity() {

    private lateinit var binding: ActivityConnectDeviceBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_connect_device)
        binding.lifecycleOwner = this     
    }

    override fun onStart() {
        super.onStart()
        // below line prevents UI rendering unless called in new thread eg Thread(Runnable {})
        while( !checkPermissions()) {sleep(2000L)}
        // now we can do other stuff like connect to the device here.
    }

    private fun checkPermissions(): Boolean {
        when {
            !(PermissionChecker.checkSelfPermission(this,
                Manifest.permission.ACCESS_COARSE_LOCATION) == PermissionChecker.PERMISSION_GRANTED) -> {
                Log.i(TAG, "permission ACCESS_COARSE_LOCATION")
                displayRationale(getString(R.string.permission_access_coarse_location))
                return false
            }
            // other permissions omitted for brevity
        }
        return true
    }

    private fun displayRationale(permissionString: String) {
        Log.i(TAG, "Displaying permission rationale...")
        var alertBuilder = AlertDialog.Builder(this)
            .setMessage(permissionString)
            .setNegativeButton("Exit") { _, _ -> moveTaskToBack(true); exitProcess(-1)}
        when(permissionString) {
            getString(R.string.permission_access_coarse_location) -> {
                Log.i(TAG, getString(R.string.permission_access_coarse_location))
                alertBuilder.setPositiveButton("Fix issue") { _, _ -> // create onclick function
                    ActivityCompat.requestPermissions(this,
                        arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                        PERMISSION_ACCESS_COARSE_LOCATION)
                }
            }
        }
        Log.i(TAG, "Going to show alert")
        alertBuilder.create().show()
        Log.i(TAG, "Alert has been shown")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...