#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()
.