JetPack Compose: Нарисуйте за навигационной панельAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 JetPack Compose: Нарисуйте за навигационной панель

Сообщение Anonymous »

Я хочу, чтобы мое приложение Android JetPack Compose нарисовало за системой системной навигационной панели, но не за строкой состояния системы.
Мне удалось это сделать, но для окна. Нарисуйте надлежащий фон за windownsets.type.navigationbars () или windowsinsets.type.tappableElement () вместо.
Я не понимаю, что они предлагают. Эти две функции возвращают navigation_bars = 2 и tappable_element = 64, не очень поучительны. Я уже готов рискнуть за панелью навигации.

Как мне нарисовать за панель навигации неопределенным образом? изображение). < /p>
< /li>
Мне очень не нравится проверка ориентации и дублирование кода, но вместо этого я не знаю, что делать. Дублирование кода происходит из -за различных вставков, и если я вычисляю модификатор как модификатор = if (условие) модификатор. Это модификатор этого (). (Если деятельность была перезапущена, это не приведет к проблемам, но оно не перезагружается, ожидается, что оно обрабатывает самостоятельные изменения.) Примечание Android: configchanges , это связано с WebView в реальном коде.

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

package com.stackoverflow.drawbehindnavigationbar4

import android.content.res.Configuration.ORIENTATION_PORTRAIT
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalView
import com.stackoverflow.drawbehindnavigationbar4.ui.theme.ApplicationTheme

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
val defaultNavigationBarColor = window.navigationBarColor // !!! Deprecated

setContent {
setNavigationBarColor(R.color.transparent_navigation_bar, defaultNavigationBarColor)

ApplicationTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> // !!! not used
val orientation = LocalConfiguration.current.orientation
if (orientation == ORIENTATION_PORTRAIT) {
Greeting(
name = "Whatever",
modifier = Modifier.statusBarsPadding()
)
} else {
Greeting(
name = "Whatever",
modifier = Modifier.navigationBarsPadding().statusBarsPadding()
)
}
}
}
}
}

@Composable
private fun setNavigationBarColor(
customNavigationBarColorArgb: Int,
defaultNavigationBarColor: Int
) {
val configuration = LocalConfiguration.current
val view = LocalView.current
LaunchedEffect(configuration.toString(), view.isInEditMode) {
val orientation = configuration.orientation
if (orientation == ORIENTATION_PORTRAIT && !view.isInEditMode) {
window.navigationBarColor = customNavigationBarColorArgb // !!! Deprecated
} else {
window.navigationBarColor = defaultNavigationBarColor // !!! Deprecated
}
}
}
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Column(
modifier = modifier.background(Color.Red).fillMaxWidth()
) {
Text(
text = "Top of $name!",
)
var text by remember { mutableStateOf("foo") }
TextField(
value = text,
onValueChange = { text = it },
colors = OutlinedTextFieldDefaults.colors( unfocusedContainerColor = Color.Yellow )
)
Spacer(Modifier.weight(1.0f))
Text(
text = "Bottom of $name!",
)
}
}

И есть 3 небольших изменения: тема, переименованная в ApplicationTheme и

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

+++ b/app/src/main/AndroidManifest.xml
+            android:windowSoftInputMode="adjustResize"
+            android:configChanges="screenLayout|orientation|screenSize|keyboard|keyboardHidden|smallestScreenSize|uiMode"

+++ b/app/src/main/res/values/colors.xml
+    #20000000


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

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

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

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

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

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