@Composable
fun ModalDrawer(
drawerContent: @Composable ColumnScope.() -> Unit,
modifier: Modifier = Modifier,
drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
gesturesEnabled: Boolean = true,
drawerShape: Shape = MaterialTheme.shapes.large,
drawerElevation: Dp = DrawerDefaults.Elevation,
drawerBackgroundColor: Color = MaterialTheme.colors.surface,
drawerContentColor: Color = contentColorFor(drawerBackgroundColor),
scrimColor: Color = DrawerDefaults.scrimColor,
content: @Composable () -> Unit
) {
}
- ModalDrawer 放在根布局(如果不需要沉浸式可以不用放在根布局)
- 如果需要使用标题栏,标题栏可以放到content中
- 样式中需要使用
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
@Composable
fun Drawer2Screen() {
val drawerState = rememberDrawerState(DrawerValue.Closed)
val scope = rememberCoroutineScope()
val list = listOf(
DrawerItemData(
0,
R.string.title_robot,
R.drawable.ic_home_24,
R.drawable.ic_home_select_24
),
DrawerItemData(
1,
R.string.title_map,
R.drawable.ic_widgets_24,
R.drawable.ic_widgets_select_24
)
)
val context = LocalContext.current
ModalDrawer(
drawerState = drawerState,
drawerContent = {
DrawerHeader {
scope.launch { drawerState.close() }
}
DrawerContent(modifier = Modifier.fillMaxSize(), lists = list) {
Toast.makeText(context, "点击了${it}", Toast.LENGTH_SHORT).show()
scope.launch { drawerState.close() }
}
},
content = {
Scaffold(
modifier = Modifier.systemBarsPadding(),
topBar = {
IconButton(onClick = { scope.launch { drawerState.open() } }) {
Icon(
painter = painterResource(id = R.drawable.ic_home_select_24),
contentDescription = "打开抽屉",
tint = MaterialTheme.colors.primary
)
}
},
) {
Spacer(Modifier.height(20.dp))
Button(onClick = { scope.launch { drawerState.open() } }) {
Text("Click to open")
}
}
}
)
}
抽屉头部布局:DrawerHeader
@Composable
fun DrawerHeader(action: (int: Int) -> Unit) {
ConstraintLayout(
modifier = Modifier
.fillMaxWidth()
) {
val (top_view, iv_header, tv_name, tv_version) = createRefs()
val bgImg = LocalContext.current.getDrawable(R.drawable.side_nav_bar)
Box(modifier = Modifier
.constrainAs(top_view) {
start.linkTo(parent.start)
top.linkTo(parent.top)
}
.fillMaxWidth()
.height(210.dp)
.drawBehind {
bgImg?.apply {
updateBounds(0, 0, size.width.toInt(), size.height.toInt())
draw(drawContext.canvas.nativeCanvas)
}
}
)
Image(
painter = painterResource(id = R.drawable.ic_robot),
contentDescription = null,
modifier = Modifier
.systemBarsPadding(
start = false,
top = true,
end = false,
bottom = false
)
.constrainAs(iv_header) {
start.linkTo(top_view.start, margin = 16.dp)
top.linkTo(top_view.top, margin = 24.dp)
}
.clickable { action(1) }
.size(120.dp, 80.dp)
)
Text(
text = stringResource(id = R.string.app_name), modifier = Modifier
.constrainAs(tv_name) {
start.linkTo(iv_header.start)
top.linkTo(iv_header.bottom, margin = 8.dp)
},
style = TextStyle(
fontSize = 16.sp,
textAlign = TextAlign.Start,
color = Color.White
)
)
Text(
text = String.format("V%s",BuildConfig.VERSION_NAME),
modifier = Modifier
.constrainAs(tv_version) {
start.linkTo(tv_name.start)
top.linkTo(tv_name.bottom, margin = 8.dp)
},
style = TextStyle(
fontSize = 16.sp,
textAlign = TextAlign.Start,
color = Color.White
)
)
}
}
抽屉列表布局:
@Composable
fun DrawerContent(modifier: Modifier, lists: List<DrawerItemData>, onClick: (id: Int) -> Unit) {
val selectId = remember { mutableStateOf(lists[0].id) }
LazyColumn(modifier = modifier, contentPadding = PaddingValues(4.dp, 6.dp)) {
itemsIndexed(lists, key = { _, item -> item.id }) { index, item ->
DrawerContentItem(itemData = item, selectId = selectId.value) {
if (selectId.value != it) selectId.value = it
onClick(index)
}
Spacer(modifier = Modifier.height(6.dp))
}
}
}
抽屉条目布局:
@Composable
fun DrawerContentItem(itemData: DrawerItemData, selectId: Int, onClick: (id: Int) -> Unit) {
val isSelect = itemData.id == selectId
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.height(36.dp)
.clickable { onClick(itemData.id) }
.background(
if (isSelect) MaterialTheme.colors.primary else Color.Transparent,
RoundedCornerShape(4.dp)
),
) {
Spacer(modifier = Modifier.width(10.dp))
Image(
painter = painterResource(id = if (isSelect) itemData.imgSelect else itemData.img),
contentDescription = null
)
Spacer(modifier = Modifier.width(10.dp))
Text(
text = stringResource(id = itemData.rs),
style = TextStyle(
fontSize = 16.sp,
textAlign = TextAlign.Start,
color = if (isSelect) MaterialTheme.colors.primaryVariant else Color.Black
)
)
}
}
条目使用数据结构:
data class DrawerItemData(
val id: Int,
@StringRes val rs: Int,
@DrawableRes val img: Int,
@DrawableRes val imgSelect: Int,
)
是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'
我想为网站的管理和公共(public)部分设置一对样式指南。每个都需要自己的布局,其中包含静态html和调用erbpartials的混合(因此静态页面不会削减它)。我不需要Controller来为这些页面提供服务,而且我不希望有效的仅开发内容使其余代码困惑。这让我想知道是否有一种方法可以直接呈现布局。免责声明:我明白这不是我应该经常/永远做的事情,而且我知道有很多争论可以解释为什么这是一个坏主意。我对这是否可能感兴趣。有没有办法让我直接从routes.rb渲染布局而不通过Controller? 最佳答案 出于某种奇怪的原因,我想暂时
这个问题在这里已经有了答案:differentlayoutforsign_inactionindevise(8个答案)关闭7年前。如何更改设计Controller中的布局?
我有request.env['http_host']在本地主机上工作,但在heroku的布局页面中引用时会导致错误。此请求在View中工作并显示正确的基本url,但是当我将代码移动到布局时它会导致错误。注意-我正在使用它来为html电子邮件中的图像构建绝对url。收到错误:ActionView::Template::Error(undefinedmethod`env'fornil:NilClass): 最佳答案 如果你想要没有端口的主机,只需使用:request.host编辑:糟糕,我刚刚注意到您正在使用View中的代码。我不知道它
我对RubyGUI设计做了很多研究,这似乎是Ruby倾向于落后的领域。我探索了MonkeyBars、wxRuby、fxRuby、Shoes等选项,只是想从Ruby社区获得一些意见。虽然它们绝对可用,但每一个的开发似乎都在下降。我在任何(减去fxRuby书)上都找不到大量有用的文档或用户基础。我只是想制作一个简单的GUI,所以我真的不想花费数百小时来学习更复杂的工具的复杂性或尝试使用甚至不再开发的东西(鞋子是应用程序的类型我正在寻找,但它有很多问题并且没有得到积极开发。)在所有选项中,你们会推荐哪个选项是最快的,并且仍然具有某种开发基础?谢谢! 最佳答案
我正在覆盖设计注册Controller的创建操作。我有两种注册表格,个人或公司,公司有一个名为company_form的字段设置为true以区分这两种表格。在表单验证后,我希望呈现正确的表单(以前无论我使用什么表单,它都会返回默认表单)。我遇到了一个问题,即只渲染了部分(很明显,因为我只渲染了部分),但我还需要渲染布局/应用程序文件。classRegistrationsControllerifresource.company_formrenderpartial:'shared/company_signup_form'elserenderpartial:'/shared/individu
我正在学习michaelharltrails教程,但出现此错误Missingtemplatelayouts/mailerwith{:locale=>[:en],:formats=>[:html],:variants=>[],:handlers=>[:raw,:erb,:html,:builder,:ruby,:coffee,:jbuilder]}.Searchedin:*"/home/ubuntu/workspace/app/views"预览账户激活时这是我的user_mailer.rbclassUserMailer错误突出显示了mailto:user.email,subject:"A
tl;dr:在Sinatra中是否有一种干净的嵌套布局方式?对于我网站上的所有页面,我有一个通用的layout.erb,它呈现页眉、页脚和其他一些位。对于这些页面的一个子集,我想使用内部布局,除了那些公共(public)位之外,它还呈现左侧菜单。全局erb:pageTemplate执行layout.erb,其中yield执行pageTemplate在子集中erb:pageTemplate执行layout.erb,其中yield执行specificLayout.erb,其中yield执行pageTemplate。有道理吗?我对单独的类、before语句和任何其他ruby魔法持开放态度
我需要消息在项目中有不同的布局,是否可以在Rails中做这样的事情?ClassMessages::New谢谢 最佳答案 这对你有帮助classMessagesController 关于ruby-on-rails-在Rails中是否可以动态加载类布局?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1274999/
我正在尝试在独立(非Rails)应用程序中做这样的事情:layout.slim:h1Hello.content=yield显示.slim:=object.name=object.description我不知道如何指定布局和模板。这对slim(或haml)有可能吗?谢谢。 最佳答案 layout.slim文件如下所示:h1Hello.content==yieldcontents.slim文件如下所示:=name这可以缩短,但为了便于解释,我将其分成了各个步骤。require'slim'#Simpleclasstorepresentan