Kotlin Android последовательно показывает пару уже определенных действий с макетом

#android #android-layout #kotlin

#Android #android-layout #kotlin

Вопрос:

Я унаследовал часть кода и хочу просмотреть все действия с макетом, уже разработанные в приложении, в виде XML-файлов, которых много. Да, я знаю, что могу просмотреть их в AS, но я хочу просмотреть их на реальном экране смартфонов View, которыми я владею. Я вижу 2 таких разработанных действия с макетом, но это не позволяет видеть 3, 4 или более …, не уверен, почему.. Попробовал пару возможностей здесь, пока нет решения.

 package com.explore.appviews

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.appcompat.app.AppCompatActivity
import java.util.*
import kotlin.concurrent.schedule

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_first_launch)


        Handler(Looper.getMainLooper()).postDelayed({
         // setContentView(R.layout.activity_fullscreen_image_viewer)
         setContentView(R.layout.activity_login)
        }, 3000)

        Handler(Looper.getMainLooper()).postDelayed({
            setContentView(R.layout.activity_fullscreen_image_viewer)
         //   setContentView(R.layout.activity_login)
        }, 3000)

    }
}
 

Ответ №1:

Я не знаю, является ли это причиной вашей проблемы, но вы ставите в очередь два изменения макета на 3 секунды в будущем, то есть в одно и то же время. Таким образом, первое отобразится и будет немедленно заменено вторым. Вы, вероятно, видите first_launch , а затем три секунды спустя fullscreen_image_viewer ?

Вероятно, вам следует просто составить список всех ваших ресурсов макета, затем опубликовать отложенную задачу, которая показывает следующую в списке, и опубликовать новую отложенную задачу, если есть еще

 class MainActivity : AppCompatActivity() {
    val layouts = listOf(
        R.layout.activity_first_launch,
        R.layout.activity_login,
        R.layout.activity_fullscreen_image_viewer
    )

    var nextLayout = 0
    val handler = Handler(Looper.getMainLooper())

    fun showNext() {
        // if we've hit the end, this skips and ends the posting cycle
        if (nextLayout < layouts.size) {
            setContentView(layouts[nextLayout])
            nextLayout  
            // run this function again in 3 seconds
            handler.postDelayed(::showNext, 3000)
        }
    }

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

или было Stack бы аккуратнее, не нужно отслеживать текущую позицию и проверять границы списка

Комментарии:

1. Спасибо! Это действительно то, что я хочу иметь возможность просматривать все определенные макеты.

2. И да, если вы поворачиваете устройство горизонтально, оно перезапускает слайд-шоу .. Не уверен, почему, но приятно… Еще раз спасибо, это экономит мне день или два!

3. Да, когда вы поворачиваете, это разрушает действие, поэтому вы потеряете это состояние — вы всегда можете переопределить onSaveInstanceState и вставить текущее значение в пакет с помощью ключа. Затем измените onCreate , чтобы извлечь значение, и используйте 0 для параметра значения по умолчанию, и установите nextLayout его перед вызовом showNext() .