Page Jump
Uzun bir listenin bir sayfasına numarasıyla götürür: "Sayfaya git" sözleri ve yanında numaranın yazıldığı kısa bir alan.
import com.pantrixui.components.data.pagination.PantrixPageJump
- Numaralar ve boşluklar. İlk ve son
boundaryCountsayfa ile ekrandaki sayfanın iki yanındakisiblingCountsayfa gösterilir; aradakiler üç noktalı bir boşluğa katlanır. İkisi de verilmezse birdir. Bir boşluk en az iki sayfanın yerini tutar: arada tek sayfa kaldıysa o sayfanın kendisi gösterilir. Katlanacak kadar sayfa olduğunda satırda, hangi sayfa ekranda olursa olsun, aynı sayıda öğe vardır: bir uca yakınken o yanda daha çok sayfa durur. - Dar yerde. Numaralarına dar gelen satır adım adım katlanır: önce ekrandaki sayfanın yanında daha az sayfa gösterir, sığdığı kadarını; o da sığmazsa uçlarda daha az sayfa, bire kadar. Numaralı hiçbir satırın sığmadığı yerde önceki, "Sayfa 3 / 10" ve sonraki olarak dizilir. Yer, satırın en geniş olduğu sayfa için sorulur: satır her sayfada aynı katlanır ve sayfa değiştikçe düzeni değişmez. Nasıl dizileceğini pencere değil, satıra kalan genişlik belirler.
PaginationLayout.Compactkısa satırı her genişlikte ister. Düğmelerinden de dar bir yerde kısa satır küçülerek çizilir: düğmeleri kesilmez. - İlk ve son sayfa.
firstAndLast = trueöncekinin ve sonrakinin dışına birer düğme daha koyar: biri ilk sayfaya, öteki son sayfaya gider. İlk sayfada baştaki iki düğme, son sayfada sondaki iki düğme basılmaz. Dört düğme numaralara kalan yeri azaltır. - Ekrandaki sayfa. Dolgusuyla ayrılır ve düğme değildir: ona basmak hiçbir şey bildirmez.
- Uçlar. İlk sayfada önceki, son sayfada sonraki basılmaz. Sayfaların dışında kalan bir
pageen yakın sayfa sayılır. Birin altındaki birpageCountbir sayılır: içinde hiçbir şey olmayan listenin tek, boş bir sayfası vardır ve satırın okları basılmaz. - Basılmayan satır.
enabled = falsesatırın tamamını kapatır: hiçbir parçası basılmaz ve satır temanın devre dışı renkleriyle çizilir. Klavyenin odağı satırın bir parçasındayken satır kapanırsa odak orada kalır; satır yeniden açıldığında kaldığı yerden devam edilir. - Ölçüler.
PaginationStyle.itemSizebir numaranın, öncekinin ve sonrakinin boyudur: Android'de 40dp, iOS'ta 36dp, masaüstünde ve web'de 32dp. Ona sığmayan uzun bir numara öğesini genişletir; önceki ve sonrakinin ikonu öğenin yarısından 4dp büyüktür.itemShapeköşeleri verir: Android'de ve iOS'ta tam yuvarlak, masaüstünde ve web'de küçük.itemGapiki komşunun arasıdır ve yoğunlukla ölçeklenir. Her öğenin çevresinde platformun dokunma hedefi kadar yer ayrılır; satır öğeleri kadar geniş, en az o hedef kadar yüksektir. - Yazı.
textStylenumaraların ve kısa satırın sözlerinin yazı stilidir, verilmezse temanınlabelstili. Stil öğeyi büyütünce yazı kendiliğinden büyümez: büyük öğeye büyük yazı da verilir. - Rakamlar. Numaralar, kısa satırın sözlerindeki sayılar ve ekran okuyucuya söylenen adlardaki sayılar temanın dilinin rakamlarıyla yazılır (
PantrixStrings.digits): Arapça pakette Arap rakamlarıyla.onPageChangeher dilde aynı sayıyı bildirir. - Renkler.
PaginationColorsnumaraları ve kısa satırın sözlerini (content), önceki, sonraki ve boşluk işaretlerini (control), ekrandaki sayfanın dolgusunu ve numarasını (selectedContainer,selectedContent) ayrı ayrı boyar. Bir dolgunun üstünde renk verilmeyen satırın tamamı dolgunun üstüne yazılan renktedir; ekrandaki sayfa, o rengin bir payı olan dolgusuyla ayrılır. - Sağdan sola. Sağdan sola okunan dillerde satır sağdan başlar ve oklar döner.
- Sayfa boyu.
PantrixPageSize"Sayfa başına" sözleri ve yanında boyların select'idir. Seçilen boy çağıranındır:pageSizeile verilir, başka bir boy seçilinceonPageSizeChangeile bildirilir; seçili boyu yeniden seçmek bir şey bildirmez. Boylar verilmezse 10, 25, 50 ve 100'dür (DefaultPageSizes);pageSizesbaşkalarını verir. Boylardan biri olmayan birpageSizeda seçili gösterilir ve listede, kendisinden büyük ilk boyun önünde durur. Select en uzun boyun gerektirdiği kadar geniştir: seçim değiştikçe satır yerinde durur. - Sayfaya git.
PantrixPageJump"Sayfaya git" sözleri ve yanında kısa bir alandır. Enter ya da ekran klavyesinin eylemi yazılan sayfayıonPageChangeile bildirir ve alanı boşaltır; odak alanda kalır. Sayfaların dışında kalan bir numara en yakın sayfa sayılır; boş alan bir şey bildirmez. Alan yalnızca rakam alır, Batı rakamlarını ve temanın dilinin rakamlarını, ve son sayfanın numarasındaki kadar hane tutar. - Yardımcıların sözleri. İkisinde de sözler kontrolün önünde, satırın başladığı yandadır ve göz içindir: ekran okuyucuya, adı o sözler olan tek bir kontrol verilir.
labelsözleri değiştirir. Dar yerde sözler kısalır, kontrol kısalmaz.enabled = falsesözleri devre dışı yazı rengiyle yazar ve kontrolü kapatır. - Otomasyon.
tagKeyverilen satırPagination_<tagKey>olur ve parçaları onun içinde adlandırılır:Pagination_orders.Page_4,Pagination_orders.Step_previous,Pagination_orders.Step_next,Pagination_orders.Step_first,Pagination_orders.Step_last, kısa satırın sözleriPagination_orders.Text_position. İstenen her sayfa, numarasıyla ve onu neyin istediğiyle (page,previous,next,first,last),selectolarak bildirilir. YardımcılarPageSize_<tagKey>vePageJump_<tagKey>olur; içlerindeki selectSelect_<tagKey>_page_size, alanTextField_<tagKey>_page_jumpetiketini taşır.
Örnekler
Bir tablonun ayağında: sayfa boyu ve sayfaya git
Bir tablonun ayağı: PantrixPageSize bir sayfada kaç sipariş gösterileceğini seçtirir, PantrixPagination sayfalar arasında gezdirir, PantrixPageJump numarası yazılan sayfaya götürür. Üçü bir FlowRow'dadır: yeri olan yerde yan yana durur, dar yerde sığmayan alt satıra iner; dik tutulan bir telefonda üçü alt alta durur. Bir Row sığmayanı alt satıra indirmez: sonda duranı kalan yere sıkıştırır. Üçünün yüksekliği aynı olmayabilir: itemVerticalAlignment onları ortalarından hizalar.
Üçü de ekranın durumunu okur ve birbirini bilmez. Sayfa boyunu değiştir: kırk sekiz sipariş üçer üçer on altı, onar onar beş sayfa eder; satırın numaraları ve alanın aldığı hane sayısı yeni sayfa sayısına uyar. Boy değişirken görünen ilk sipariş ekranda kalır: açılan sayfa, o siparişin yeni boyda düştüğü sayfadır. Dördüncü sayfada, 16–20 arası görünürken 10'u seç: ikinci sayfa, 11–20 arası gelir. Kırk sekiz sipariş için boylar küçük: hazır boyların (DefaultPageSizes) ilkinden, 10'dan önce 3 ve 5.
Alana bir numara yaz ve Enter'a bas: o sayfa açılır, alan boşalır ve odak alanda kalır. Son sayfadan büyük bir numara son sayfayı açar; alan rakamdan başkasını almaz. İstenen sayfa, neyle istenirse istensin, kartın "Son olay" satırına yazılır.
val report = LocalExampleEvents.current
var pageSize by rememberSaveable { mutableIntStateOf(ORDERS_PER_PAGE) }
var page by rememberSaveable { mutableIntStateOf(1) }
val pageCount = (ORDER_COUNT + pageSize - 1) / pageSize
val first = (page - 1) * pageSize + 1
val last = minOf(page * pageSize, ORDER_COUNT)
val open: (Int) -> Unit = { asked ->
page = asked
report("$asked. sayfa istendi")
}
OrderRows(first = first, last = last, rows = pageSize, tagKey = "row")
PantrixText(
text = "$ORDER_COUNT siparişten $first–$last arası",
color = PantrixTheme.colors.textSecondary,
tagKey = "foot_shown"
)
FlowRow(
horizontalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.lg),
verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm),
itemVerticalAlignment = Alignment.CenterVertically
) {
PantrixPageSize(
pageSize = pageSize,
onPageSizeChange = { size ->
// Görünen ilk sipariş yeni boyda hangi sayfaya düşüyorsa o sayfa açılır: sipariş ekranda kalır.
val kept = (first - 1) / size + 1
pageSize = size
page = kept
report("Sayfada $size sipariş: $kept. sayfa açıldı")
},
pageSizes = listOf(3, 5) + DefaultPageSizes.first(),
tagKey = "foot"
)
PantrixPagination(page = page, pageCount = pageCount, onPageChange = open, tagKey = "foot")
PantrixPageJump(pageCount = pageCount, onPageChange = open, tagKey = "foot")
}
@Composable
private fun OrderRows(
first: Int,
last: Int,
rows: Int,
tagKey: String
) {
PantrixSurface(modifier = Modifier.fillMaxWidth(), border = PantrixTheme.colors.divider) {
Column {
for (order in first until first + rows) {
val listed = order <= last
// Boş satırın çizgisi de yerini tutar, ama çizilmez.
val line = if (listed) Color.Unspecified else Color.Transparent
if (order > first) PantrixHorizontalDivider(color = line)
Row(
modifier = Modifier.fillMaxWidth().padding(PantrixTheme.spacing.md),
horizontalArrangement = Arrangement.SpaceBetween
) {
if (listed) {
PantrixText(text = "Sipariş #${FIRST_ORDER + order}", tagKey = "${tagKey}_$order")
PantrixText(text = "${1 + order % 4} ürün", color = PantrixTheme.colors.textSecondary)
} else {
// Boş bir yazı da bir satır yüksekliğindedir; ekran okuyucuya söylenecek bir şeyi yoktur.
PantrixText(text = "", role = TextRole.Decorative)
}
}
}
}
}
}
private const val ORDER_COUNT = 48
private const val ORDERS_PER_PAGE = 5
private const val FIRST_ORDER = 4800
API
pageCount
Uzun bir listenin bir sayfasına numarasıyla götürür: "Sayfaya git" sözleri ve yanında numaranın yazıldığı kısa bir alan.
| Parametre | Tür | Varsayılan | Ne olduğu |
|---|---|---|---|
pageCount | Int | Kaç sayfa olduğu: bir numaranın sayılabileceği son sayfa ve alanın tuttuğu hane sayısı. Birin altındaki sayı bir sayılır, PantrixPagination'da olduğu gibi. | |
onPageChange | (page: Int) -> Unit | İstenen sayfayla çağrılır: numarasıyla, birden sayılarak. | |
modifier | Modifier | Modifier | Satıra uygulanır. |
label | String | PantrixTheme.strings.goToPage | Alanın önündeki sözler ve alanın ekran okuyucudaki adı: verilmezse temanın "Sayfaya git" sözleri. |
enabled | Boolean | true | Bir numaranın yazılıp yazılamadığı: kullanılamayan satırın sözleri devre dışı yazı rengindedir ve alanı devre dışıdır; odak almaz ve bunu söyler. |
tagKey | String? | null | Otomasyon için dilden bağımsız bir anahtar. Satırın test etiketi PageJump_<tagKey>, sözlerininki PageJump_<tagKey>.Text_label olur. İçindeki alanın anahtarı <tagKey>_page_jump'tır ve bir metin alanı gibi etiketlenir: TextField_<tagKey>_page_jump. Bir etikete sığmayacak kadar uzun bir anahtar kesilir, _page_jump bütün kalır. İstenen sayfa, sayfasıyla birlikte PageJump olarak bildirilir; yazılan hiçbir zaman bildirilmez. Alanın odağı aldığı da satırın etiketiyle PageJump olarak bildirilir: satır tek bir bileşendir ve tek bir adla bildirir. |
Erişilebilirlik
- Klavye. Numaralar ve oklar Tab'ın birer durağıdır; Enter ve boşluk basar. Ekrandaki sayfa da bir duraktır ve klavyenin üstüne koyduğu odağı korur: klavyeyle açılan sayfada odak yerinde kalır. Satır bir ucuna geldiğinde, artık basılamayan düğmenin odağını ekrandaki sayfa alır; kısa satırda öteki yandaki düğme alır.
- Ekran okuyucu. Bir numara, açtığı sayfayla adlandırılan bir düğmedir: "Sayfa 4". Ekrandaki sayfa düğme değildir ve okuyucuya basılacak bir şey sunmaz: "Geçerli sayfa" durumuyla okunur. Boşluklar okunmaz. İlk ve son sayfaya giden düğmelerin adı "İlk sayfa" ve "Son sayfa"dır. Kısa satırın sözleri her değiştiğinde okuyucuya söylenir. Satır "Sayfalama" adlı bir gruptur. iOS'ta grubun adı yoktur: oradaki okuyucu bir grubun adını içindekilerden sonra okur.