Kotlin - выполнить функцию в MainActivity из внешней части MANECTICTIONAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Kotlin - выполнить функцию в MainActivity из внешней части MANECTICTION

Сообщение Anonymous »

Надеюсь, это просто. У меня есть приложение, которое в настоящее время имеет полноэкранную дисплей времени. Каждую секунду время обновляется. В качестве теста у меня есть функция Doding () внутри MainActivity . Если я позвоню в это внутри Oncreate , то звук воспроизводясь, когда приложение запускается. Это работает.
Я хочу иметь возможность назвать эту же функцию вне MainActivity . Я пробовал различные методы, которые я нашел с Googling, но все они, кажется, заставляют приложение сбой при запуске. < /P>
Вот текущий полный код. Я хочу, чтобы Doding () во второй последней строке запустил функцию Doding () внутри mainActivity . Для этого теста он будет играть в WAV каждую секунду, но это просто чтобы заставить логику работать. Как только это сработает, я добавлю логику, чтобы он говорил время каждые X минут, которые указывает пользователь. < /P>

Код: Выделить всё

package com.example.talkingclockversion1

import android.media.MediaPlayer
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.annotation.RequiresApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.sp
import androidx.lifecycle.ViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.talkingclockversion1.ui.theme.TalkingClockVersion1Theme
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import kotlin.time.Duration.Companion.seconds

class MainActivity : ComponentActivity() {
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
TalkingClockVersion1Theme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
// Hide both the navigation bar and the status bar
// This is deprecated, but newer code does not get rid of the three dots at the center of the top of the screen
window.decorView.apply {
systemUiVisibility =
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN
}
SetScreenBackgroundToBlack()
UpdateTime()
}
}
}
doDing()
}

fun doDing(){
var mediaPlayer = MediaPlayer.create(this, R.raw.f_ding)
mediaPlayer.start()
}
}

//runs every second to update the time
@RequiresApi(Build.VERSION_CODES.O)
class TimeViewModel : ViewModel() {
@RequiresApi(Build.VERSION_CODES.O)
private val formatter = DateTimeFormatter.ofPattern("HH:mm:ss")
private val _current = MutableStateFlow("")
val current = _current.asStateFlow()

init {
viewModelScope.launch {
while (true) {
tick()
delay(1.seconds)

}
}
}

@RequiresApi(Build.VERSION_CODES.O)
private fun tick() {
_current.value = LocalDateTime.now().format(formatter)
}
}

//gets the current time, formats it, and passes it to the display function
@Composable
@RequiresApi(Build.VERSION_CODES.O)
fun UpdateTime() {
val viewModel: TimeViewModel = viewModel()
val current by viewModel.current.collectAsStateWithLifecycle()

TimeDisplay(
name = current,
modifier = Modifier.fillMaxWidth()
)
}

//clears the screen background to black
@Composable
fun SetScreenBackgroundToBlack() {
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.Black)
)
}

//draws the actual time display
@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun TimeDisplay(name: String, modifier:  Modifier = Modifier) {
//the space above the text increases by 5 pixels every minute to help avoid burn-in
var currentMinute = LocalDateTime.now().format(DateTimeFormatter.ofPattern("mm"))
var topBufferLines = 400+currentMinute.toInt()*5
Text(
text = "$name",
color = Color.LightGray,
fontSize = 300.sp,
//lineHeight = 500.sp,
lineHeight = topBufferLines.sp,
textAlign = TextAlign.Center,
modifier = modifier.background(Color.Black)
)
doDing()
}
Может ли кто -нибудь помочь мне получить правильные объявления/синтаксис, чтобы я мог назвать Doding () (или потенциально другие функции в MainActivity) извне MateActivity?

Подробнее здесь: https://stackoverflow.com/questions/797 ... inactivity
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»