Skip to content
This repository was archived by the owner on Jul 11, 2025. It is now read-only.

Commit 45459b3

Browse files
authored
Merge pull request #424 from android/av/list-detail-compose-placeholder
Add placeholder for list-detail-compose
2 parents c150926 + 9437057 commit 45459b3

File tree

4 files changed

+34
-21
lines changed

4 files changed

+34
-21
lines changed

CanonicalLayouts/list-detail-compose/app/src/main/java/com/example/listdetailcompose/MainActivity.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ package com.example.listdetailcompose
1818
import android.os.Bundle
1919
import androidx.activity.ComponentActivity
2020
import androidx.activity.compose.setContent
21+
import androidx.compose.foundation.layout.fillMaxSize
22+
import androidx.compose.material3.Surface
2123
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
2224
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
25+
import androidx.compose.ui.Modifier
2326
import com.example.listdetailcompose.ui.ListDetailSample
2427
import com.example.listdetailcompose.ui.theme.ListDetailComposeTheme
2528
import com.google.accompanist.adaptive.calculateDisplayFeatures
@@ -30,10 +33,12 @@ class MainActivity : ComponentActivity() {
3033
super.onCreate(savedInstanceState)
3134
setContent {
3235
ListDetailComposeTheme {
33-
ListDetailSample(
34-
windowSizeClass = calculateWindowSizeClass(this),
35-
displayFeatures = calculateDisplayFeatures(this)
36-
)
36+
Surface(modifier = Modifier.fillMaxSize()) {
37+
ListDetailSample(
38+
windowSizeClass = calculateWindowSizeClass(this),
39+
displayFeatures = calculateDisplayFeatures(this)
40+
)
41+
}
3742
}
3843
}
3944
}

CanonicalLayouts/list-detail-compose/app/src/main/java/com/example/listdetailcompose/ui/ListDetail.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ fun ListDetail(
5656
isDetailOpen: Boolean,
5757
setIsDetailOpen: (Boolean) -> Unit,
5858
showListAndDetail: Boolean,
59-
detailKey: Any,
59+
detailKey: Any?,
6060
list: @Composable (isDetailVisible: Boolean) -> Unit,
6161
detail: @Composable (isListVisible: Boolean) -> Unit,
6262
twoPaneStrategy: TwoPaneStrategy,
@@ -110,7 +110,7 @@ fun ListDetail(
110110
// state while switching between details.
111111
// If this behavior isn't desired, this can be replaced with a key on the
112112
// selectedWordIndex.
113-
detailSaveableStateHolder.SaveableStateProvider(currentDetailKey) {
113+
detailSaveableStateHolder.SaveableStateProvider(currentDetailKey ?: "null") {
114114
Box(
115115
modifier = Modifier
116116
.userInteractionNotification {

CanonicalLayouts/list-detail-compose/app/src/main/java/com/example/listdetailcompose/ui/ListDetailSample.kt

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import androidx.compose.foundation.verticalScroll
3333
import androidx.compose.material.ripple.rememberRipple
3434
import androidx.compose.material3.Card
3535
import androidx.compose.material3.CardDefaults
36-
import androidx.compose.material3.ExperimentalMaterial3Api
3736
import androidx.compose.material3.MaterialTheme
3837
import androidx.compose.material3.Text
3938
import androidx.compose.material3.windowsizeclass.WindowSizeClass
@@ -46,8 +45,10 @@ import androidx.compose.runtime.rememberUpdatedState
4645
import androidx.compose.runtime.saveable.rememberSaveable
4746
import androidx.compose.runtime.setValue
4847
import androidx.compose.ui.Modifier
48+
import androidx.compose.ui.res.stringResource
4949
import androidx.compose.ui.unit.dp
5050
import androidx.window.layout.DisplayFeature
51+
import com.example.listdetailcompose.R
5152
import com.google.accompanist.adaptive.HorizontalTwoPaneStrategy
5253

5354
// Create some simple sample data
@@ -81,9 +82,9 @@ fun ListDetailSample(
8182
val widthSizeClass by rememberUpdatedState(windowSizeClass.widthSizeClass)
8283

8384
/**
84-
* The index of the currently selected word.
85+
* The index of the currently selected word, or `null` if none is selected
8586
*/
86-
var selectedWordIndex by rememberSaveable { mutableStateOf(0) }
87+
var selectedWordIndex: Int? by rememberSaveable { mutableStateOf(null) }
8788

8889
/**
8990
* True if the detail is currently open. This is the primary control for "navigation".
@@ -101,10 +102,11 @@ fun ListDetailSample(
101102
},
102103
detailKey = selectedWordIndex,
103104
list = { isDetailVisible ->
105+
val currentSelectedWordIndex = selectedWordIndex
104106
ListContent(
105107
words = sampleWords.map(DefinedWord::word),
106-
selectionState = if (isDetailVisible) {
107-
SelectionVisibilityState.ShowSelection(selectedWordIndex)
108+
selectionState = if (isDetailVisible && currentSelectedWordIndex != null) {
109+
SelectionVisibilityState.ShowSelection(currentSelectedWordIndex)
108110
} else {
109111
SelectionVisibilityState.NoSelection
110112
},
@@ -123,7 +125,7 @@ fun ListDetailSample(
123125
)
124126
},
125127
detail = { isListVisible ->
126-
val definedWord = sampleWords[selectedWordIndex]
128+
val definedWord = selectedWordIndex?.let(sampleWords::get)
127129
DetailContent(
128130
definedWord = definedWord,
129131
modifier = if (isListVisible) {
@@ -165,7 +167,6 @@ sealed interface SelectionVisibilityState {
165167
/**
166168
* The content for the list pane.
167169
*/
168-
@OptIn(ExperimentalMaterial3Api::class)
169170
@Composable
170171
private fun ListContent(
171172
words: List<String>,
@@ -254,20 +255,26 @@ private fun ListContent(
254255
*/
255256
@Composable
256257
private fun DetailContent(
257-
definedWord: DefinedWord,
258+
definedWord: DefinedWord?,
258259
modifier: Modifier = Modifier,
259260
) {
260261
Column(
261262
modifier = modifier
262263
.verticalScroll(rememberScrollState())
263264
.padding(vertical = 16.dp)
264265
) {
265-
Text(
266-
text = definedWord.word,
267-
style = MaterialTheme.typography.headlineMedium
268-
)
269-
Text(
270-
text = definedWord.definition
271-
)
266+
if (definedWord != null) {
267+
Text(
268+
text = definedWord.word,
269+
style = MaterialTheme.typography.headlineMedium
270+
)
271+
Text(
272+
text = definedWord.definition
273+
)
274+
} else {
275+
Text(
276+
text = stringResource(R.string.placeholder)
277+
)
278+
}
272279
}
273280
}

CanonicalLayouts/list-detail-compose/app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@
1616
-->
1717
<resources>
1818
<string name="app_name">ListDetailCompose</string>
19+
<string name="placeholder">Tap a word to display its definition</string>
1920
</resources>

0 commit comments

Comments
 (0)