Создание пользовательского интерфейса (перекомпоновка) с оконным менеджером, который не работает ⇐ Android
-
Anonymous
Создание пользовательского интерфейса (перекомпоновка) с оконным менеджером, который не работает
Я работаю над плавающим окном на Android, и у меня возникла проблема. Итак, у меня есть активность, которая вызывает мой плавающий класс, который создает представление и добавляет его в оконный менеджер с таймером, который отображается и ведет обратный отсчет. При попытке использовать тот же код в обычном режиме он работает. Найдите :S?
Вот моя модель представления, содержащая значение mutableStateOf
класс WicViewModel : ViewModel() { частный val TAG = "WicViewModel" личное значение а = 10000L частный вал b = 1000L частная переменная _input: Long от mutableStateOf(a) ввод переменной: длинный получить() = _input набор (значение) { если (значение == _input) вернуть _input = значение } веселое начало() { val timer = объект: CountDownTimer(a, b) { переопределить fun onTick(millisUntilFinished: Long) { Log.d("MYLOG", "текст обновляется программно") ввод = миллисУнтилФинишед } переопределить удовольствие onFinish() { ввод = 0 } } таймер.start() } } Вот мой класс с вставкой в оконный менеджер
конструктор класса WicController(val context: Context?, val viewModel: WicViewModel) { частный val TAG = "WicController" частный вар windowManager: WindowManager? = ноль частный вар wicView: Посмотреть? = ноль частный lateinit var lifecycleOwner: CDOLifecycleOwner веселое шоу() { если (контекст == ноль) вернуть val paramFloat = WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, ПолучитьТипОкна(), WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ) paramFloat.gradity = Gravity.CENTER или Gravity.END windowManager = context.getSystemService(Context.WINDOW_SERVICE) как WindowManager? val composeView = ComposeView(context.applicationContext) composeView.setContent { timerText (модель просмотра) } владелец жизненного цикла = CDOLifecycleOwner() lifecycleOwner.performRestore(ноль) lifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) ViewTreeLifecycleOwner.set(composeView, lifecycleOwner) ViewTreeSavedStateRegistryOwner.set(composeView, lifecycleOwner) windowManager?.addView(composeView, paramFloat) } весело скрыть() { windowManager?.removeView(wicView!!) context?.let { Demo.startCalldorado(it) } } личное развлечение getWindowType(): Int { вар windowType = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY } вернуть тип окна } @Композитный весело timerText (viewModel: WicViewModel) { Текст( текст = (viewModel.input/1000).toString(), модификатор = Модификатор .padding(низ = 8.dp) .fillMaxWidth(), размер шрифта = 13.sp, цвет = Цвет.Белый, ) }} Я знаю, что значение изменяется, но композиция не перекомпоновывается. иногда оно может меняться, но очень случайно.
Я не знаю, делаю ли я это неправильно или Compose не предназначен для использования оконного менеджера/плавающего окна, однако я надеюсь, что некоторые из вас, ребята, могут мне помочь, поскольку я не могу найти ничего об этом в Интернете.
р>
Я работаю над плавающим окном на Android, и у меня возникла проблема. Итак, у меня есть активность, которая вызывает мой плавающий класс, который создает представление и добавляет его в оконный менеджер с таймером, который отображается и ведет обратный отсчет. При попытке использовать тот же код в обычном режиме он работает. Найдите :S?
Вот моя модель представления, содержащая значение mutableStateOf
класс WicViewModel : ViewModel() { частный val TAG = "WicViewModel" личное значение а = 10000L частный вал b = 1000L частная переменная _input: Long от mutableStateOf(a) ввод переменной: длинный получить() = _input набор (значение) { если (значение == _input) вернуть _input = значение } веселое начало() { val timer = объект: CountDownTimer(a, b) { переопределить fun onTick(millisUntilFinished: Long) { Log.d("MYLOG", "текст обновляется программно") ввод = миллисУнтилФинишед } переопределить удовольствие onFinish() { ввод = 0 } } таймер.start() } } Вот мой класс с вставкой в оконный менеджер
конструктор класса WicController(val context: Context?, val viewModel: WicViewModel) { частный val TAG = "WicController" частный вар windowManager: WindowManager? = ноль частный вар wicView: Посмотреть? = ноль частный lateinit var lifecycleOwner: CDOLifecycleOwner веселое шоу() { если (контекст == ноль) вернуть val paramFloat = WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, ПолучитьТипОкна(), WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ) paramFloat.gradity = Gravity.CENTER или Gravity.END windowManager = context.getSystemService(Context.WINDOW_SERVICE) как WindowManager? val composeView = ComposeView(context.applicationContext) composeView.setContent { timerText (модель просмотра) } владелец жизненного цикла = CDOLifecycleOwner() lifecycleOwner.performRestore(ноль) lifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) ViewTreeLifecycleOwner.set(composeView, lifecycleOwner) ViewTreeSavedStateRegistryOwner.set(composeView, lifecycleOwner) windowManager?.addView(composeView, paramFloat) } весело скрыть() { windowManager?.removeView(wicView!!) context?.let { Demo.startCalldorado(it) } } личное развлечение getWindowType(): Int { вар windowType = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { windowType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY } вернуть тип окна } @Композитный весело timerText (viewModel: WicViewModel) { Текст( текст = (viewModel.input/1000).toString(), модификатор = Модификатор .padding(низ = 8.dp) .fillMaxWidth(), размер шрифта = 13.sp, цвет = Цвет.Белый, ) }} Я знаю, что значение изменяется, но композиция не перекомпоновывается. иногда оно может меняться, но очень случайно.
Я не знаю, делаю ли я это неправильно или Compose не предназначен для использования оконного менеджера/плавающего окна, однако я надеюсь, что некоторые из вас, ребята, могут мне помочь, поскольку я не могу найти ничего об этом в Интернете.
р>
Мобильная версия