-
Anonymous
Как исправить onBackPressed для расширенной панели поиска Material3?
Сообщение
Anonymous »
Я использую androidx.compose.material3.SearchBar в своем проекте Android. Вот структура:
Код: Выделить всё
class SearchActivity {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search)
if (savedInstanceState == null) {
addFragment(R.id.container, SearchFragment(), SearchFragment.FRAGMENT_TAG)
}
}
}
Код: Выделить всё
class SearchFragment : Fragment() {
companion object {
const val FRAGMENT_TAG = "SEARCH_FRAGMENT_TAG"
fun replaceAtBackStack(fragmentManager: FragmentManager, @IdRes containerViewId: Int) {
fragmentManager.commit {
fragmentManager.popBackStack(FRAGMENT_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
fragmentManager.replaceFragment(containerViewId, SearchFragment(), FRAGMENT_TAG, FRAGMENT_TAG)
}
}
}
private val viewModelFactory by lazy { SearchViewModelFactory(/*...*/) }
private val viewModel: SearchViewModel by viewModels { viewModelFactory }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(R.layout.fragment_search, container, false).apply {
findViewById(R.id.search_view).apply {
setViewCompositionStrategy(DisposeOnViewTreeLifecycleDestroyed)
setContent {
SearchScreen(
searchQuery = viewModel.searchQuery,
state = viewModel.searchResultsState.collectAsState().value,
onViewEvent = viewModel::onViewEvent,
)
}
isClickable = true
}
}
}
Код: Выделить всё
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchScreen(
searchQuery: String,
state: SearchResultState,
onViewEvent: (SearchViewEvent) -> Unit,
) {
MyTheme {
Scaffold { contentPadding ->
Box(
Modifier
.padding(contentPadding)
) {
var text by rememberSaveable { mutableStateOf(searchQuery) }
val expanded = true
SearchBar(
modifier = Modifier
.align(TopCenter)
.semantics { traversalIndex = 0f },
inputField = {
SearchBarDefaults.InputField(
query = text,
onQueryChange = {
text = it
onViewEvent(OnSearchQueryChange(it))
},
onSearch = { },
expanded = expanded,
onExpandedChange = { },
placeholder = { Text(stringResource(R.string.search_query_hint)) },
leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
)
},
expanded = expanded,
onExpandedChange = { }
) {
when (state) {
is Loading -> Loading()
is Success -> {
val sessions = state.parameters
if (sessions.isEmpty()) {
NoSearchResult()
} else {
SearchResultList(
parameters = sessions,
onViewEvent = onViewEvent,
)
}
}
}
}
}
}
}
}
По какой-то причине SearchBar использует жест
назад. Это не позволяет пользователю вообще покинуть экран. Как это можно исправить?
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -searchbar
1729445329
Anonymous
Я использую androidx.compose.material3.SearchBar в своем проекте Android. Вот структура:
[code]class SearchActivity {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_search)
if (savedInstanceState == null) {
addFragment(R.id.container, SearchFragment(), SearchFragment.FRAGMENT_TAG)
}
}
}
[/code]
[code]
[/code]
[code]class SearchFragment : Fragment() {
companion object {
const val FRAGMENT_TAG = "SEARCH_FRAGMENT_TAG"
fun replaceAtBackStack(fragmentManager: FragmentManager, @IdRes containerViewId: Int) {
fragmentManager.commit {
fragmentManager.popBackStack(FRAGMENT_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
fragmentManager.replaceFragment(containerViewId, SearchFragment(), FRAGMENT_TAG, FRAGMENT_TAG)
}
}
}
private val viewModelFactory by lazy { SearchViewModelFactory(/*...*/) }
private val viewModel: SearchViewModel by viewModels { viewModelFactory }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
inflater.inflate(R.layout.fragment_search, container, false).apply {
findViewById(R.id.search_view).apply {
setViewCompositionStrategy(DisposeOnViewTreeLifecycleDestroyed)
setContent {
SearchScreen(
searchQuery = viewModel.searchQuery,
state = viewModel.searchResultsState.collectAsState().value,
onViewEvent = viewModel::onViewEvent,
)
}
isClickable = true
}
}
}
[/code]
[code]
[/code]
[code]@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchScreen(
searchQuery: String,
state: SearchResultState,
onViewEvent: (SearchViewEvent) -> Unit,
) {
MyTheme {
Scaffold { contentPadding ->
Box(
Modifier
.padding(contentPadding)
) {
var text by rememberSaveable { mutableStateOf(searchQuery) }
val expanded = true
SearchBar(
modifier = Modifier
.align(TopCenter)
.semantics { traversalIndex = 0f },
inputField = {
SearchBarDefaults.InputField(
query = text,
onQueryChange = {
text = it
onViewEvent(OnSearchQueryChange(it))
},
onSearch = { },
expanded = expanded,
onExpandedChange = { },
placeholder = { Text(stringResource(R.string.search_query_hint)) },
leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
)
},
expanded = expanded,
onExpandedChange = { }
) {
when (state) {
is Loading -> Loading()
is Success -> {
val sessions = state.parameters
if (sessions.isEmpty()) {
NoSearchResult()
} else {
SearchResultList(
parameters = sessions,
onViewEvent = onViewEvent,
)
}
}
}
}
}
}
}
}
[/code]
По какой-то причине SearchBar использует жест [b]назад[/b]. Это не позволяет пользователю вообще покинуть экран. Как это можно исправить?
Подробнее здесь: [url]https://stackoverflow.com/questions/79107654/how-to-fix-onbackpressed-for-an-expanded-material3-searchbar[/url]