- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将两个常用共享的 JS 回调组合到一个 R 数据表 Shiny 应用程序(具有单选按钮(参见 https://yihui.shinyapps.io/DT-radio/ 和 Extracting user input values from radio buttons in Shiny DT into a dataframe or list)并在子/父表中嵌套行(参见 https://stackoverflow.com/a/56599838/10624798 和许多其他地方) . 单独他们都可以工作,但不能一起工作。我不确定我是否错误地绑定(bind)了 JS 或者 JS 以某种方式相互矛盾?无论哪种方式,我都无法再访问用户输入(如果我看的话,只会返回一个 null在输入 $xxx 的结构中。我已经包含了一个小例子(虽然仍然很长)我的意思。
library(shiny)
library(DT)
library(shinyWidgets)
library(tidyverse)
shinyApp(
ui = fluidPage(
title = 'Radio button and a dropdown manue ',
sliderInput("n_rows_table", "Number of rows:",
min = 0, max = 10,
value = 5),
actionBttn(
inputId = "btnCancel",
label = "Make tables",
size = "sm",
color = "warning"
),
p("THIS EXAMPLE DOES NOT WORK!"),
DT::dataTableOutput("datatable"),
verbatimTextOutput('sel'),
p("THIS SIMPLER EXAMPLE DOES WORK!"),
DT::dataTableOutput("datatable2"),
verbatimTextOutput('sel2'),
p("These of the R6 input class objects, the the ones from the first tabel do not show up"),
verbatimTextOutput('sel_all'),
),
server = function(input, output, session) {
# Ideally instead of working with a counter,
# this would just override the old value so instead of a_1, a_2,
# everything you click the button it just sets input$a back to null
# until the users clicks again.
# But in the meantime this is a work around
counter <- reactiveValues(countervalue = 0) # Defining & initializing the reactiveValues object
observeEvent(input$btnCancel, {
counter$countervalue <- counter$countervalue + 1 # if the add button is clicked, increment the value by 1 and update it
})
# ----- Create a table based on the number of rows from the slider
# ----- and create it when the user clicks the button
data_for_table <- eventReactive(
input$btnCancel,
{
tibble(
let_rowid = paste0(letters[1:input$n_rows_table], "_", counter$countervalue ),
val_1 = round(runif(input$n_rows_table, 0, 10), 1),
val_2 = round(rnorm(input$n_rows_table), 2),
val_3 = round(rnorm(input$n_rows_table), 2),
val_4 = letters[1:input$n_rows_table],
Yes = "Yes",
No = "No",
Maybe = "Maybe",
result = NA # ideally the what ever selection in yes/no/maybe shows up in this column (future improvement)
) %>%
mutate(oplus = "⊕") %>%
relocate(oplus) %>%
mutate(
Yes = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , Yes),
No = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , No),
Maybe = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , Maybe)
) %>%
nest(datalist = c(val_3, val_4)) %>%
mutate(datalist = map(datalist, as.list)) %>%
mutate(datalist = map(datalist, list))
})
# ----- Render the table
# ----- The table renders ok.
output$datatable <- DT::renderDT({
parentRows <- which(data_for_table()[,1] != "")
# ------ This JS is neede to make the child/parent dropdown
callback <- JS(
sprintf("var parentRows = [%s];", toString(parentRows-1)),
sprintf("var j0 = %d;", 0),
"var nrows = table.rows().count();",
"for(let i = 0; i < nrows; ++i){",
" var $cell = table.cell(i,j0).nodes().to$();",
" if(parentRows.indexOf(i) > -1){",
" $cell.css({cursor: 'pointer'});",
" }else{",
" $cell.removeClass('details-control');",
" }",
"}",
"",
"// --- make the table header of the nested table --- //",
"var formatHeader = function(d, childId){",
" if(d !== null){",
" var html = ",
" '<table class=\"display compact hover\" ' + ",
" 'style=\"padding-left: 30px;\" id=\"' + childId + ",
" '\"><thead><tr>';",
" var data = d[d.length-1] || d.datalist;",
" for(let key in data[0]){",
" html += '<th>' + key + '</th>';",
" }",
" html += '</tr></thead></table>'",
" return html;",
" } else {",
" return '';",
" }",
"};",
"",
"// --- row callback to style rows of child tables --- //",
"var rowCallback = function(row, dat, displayNum, index){",
" if($(row).hasClass('odd')){",
" $(row).css('background-color', 'papayawhip');",
" $(row).hover(function(){",
" $(this).css('background-color', '#E6FF99');",
" }, function(){",
" $(this).css('background-color', 'papayawhip');",
" });",
" } else {",
" $(row).css('background-color', 'lemonchiffon');",
" $(row).hover(function(){",
" $(this).css('background-color', '#DDFF75');",
" }, function(){",
" $(this).css('background-color', 'lemonchiffon');",
" });",
" }",
"};",
"",
"// --- header callback to style header of child tables --- //",
"var headerCallback = function(thead, data, start, end, display){",
" $('th', thead).css({",
" 'border-top': '3px solid indigo',",
" 'color': 'indigo',",
" 'background-color': '#fadadd'",
" });",
"};",
"",
"// --- make the datatable --- //",
"var formatDatatable = function(d, childId){",
" var data = d[d.length-1] || d.datalist;",
" var colNames = Object.keys(data[0]);",
" var columns = colNames.map(function(x){",
" return {data: x.replace(/\\./g, '\\\\\\.'), title: x};",
" });",
" var id = 'table#' + childId;",
" if(colNames.indexOf('datalist') === -1){",
" var subtable = $(id).DataTable({",
" 'data': data,",
" 'columns': columns,",
" 'autoWidth': true,",
" 'deferRender': true,",
" 'info': false,",
" 'lengthChange': false,",
" 'ordering': data.length > 1,",
" 'order': [],",
" 'paging': false,",
" 'scrollX': false,",
" 'scrollY': false,",
" 'searching': false,",
" 'sortClasses': false,",
" 'rowCallback': rowCallback,",
" 'headerCallback': headerCallback,",
" 'columnDefs': [{targets: '_all', className: 'dt-center'}]",
" });",
" } else {",
" var subtable = $(id).DataTable({",
" 'data': data,",
" 'columns': columns,",
" 'autoWidth': true,",
" 'deferRender': true,",
" 'info': false,",
" 'lengthChange': false,",
" 'ordering': data.length > 1,",
" 'order': [],",
" 'paging': false,",
" 'scrollX': false,",
" 'scrollY': false,",
" 'searching': false,",
" 'sortClasses': false,",
" 'rowCallback': rowCallback,",
" 'headerCallback': headerCallback,",
" 'columnDefs': [",
" {targets: -1, visible: false},",
" {targets: 0, orderable: false, className: 'details-control'},",
" {targets: '_all', className: 'dt-center'}",
" ]",
" }).column(0).nodes().to$().css({cursor: 'pointer'});",
" }",
"};",
"",
"// --- display the child table on click --- //",
"// array to store id's of already created child tables",
"var children = [];",
"table.on('click', 'td.details-control', function(){",
" var tbl = $(this).closest('table'),",
" tblId = tbl.attr('id'),",
" td = $(this),",
" row = $(tbl).DataTable().row(td.closest('tr')),",
" rowIdx = row.index();",
" if(row.child.isShown()){",
" row.child.hide();",
" td.html('⊕');",
" } else {",
" var childId = tblId + '-child-' + rowIdx;",
" if(children.indexOf(childId) === -1){",
" // this child has not been created yet",
" children.push(childId);",
" row.child(formatHeader(row.data(), childId)).show();",
" td.html('⊖');",
" formatDatatable(row.data(), childId, rowIdx);",
" }else{",
" // this child has already been created",
" row.child(true);",
" td.html('⊖');",
" }",
" }",
"}); ",
"// --- add radio button functionality --- //",
"table.rows().every(function(i, tab, row) {",
" var $this = $(this.node());",
" $this.attr('id', this.data()[0]);",
" $this.addClass('shiny-input-radiogroup');",
" });",
" Shiny.unbindAll(table.table().node());",
" Shiny.bindAll(table.table().node());")
datatable(
data_for_table(),
escape = F,
rownames = F,
callback = callback,
options = list(
dom = 't',
paging = FALSE,
ordering = FALSE,
paging = FALSE,
searching = FALSE,
columnDefs = list(
list(
visible = FALSE,
targets = c(c(1, ncol(data_for_table())-1)) # do not show certain ID variables, we do not need
),
list(
orderable = FALSE,
className = "details-control",
targets = 0
),
list(
className = "dt-left",
targets = "_all"
)
)
)
)
},
server = F)
list_results <- reactive({
list_values <- list()
for (i in unique(data_for_table()$let_rowid)) {
list_values[[i]] <- paste0(i, ": ", input[[i]])
}
list_values
})
output$sel = renderPrint({
list_results()
})
####################################
## this simpler version does work ##
####################################
data_for_table2 <- eventReactive(
input$btnCancel,
{
tibble(
let_rowid = paste0(letters[11:(10+input$n_rows_table)], "_", counter$countervalue ),
val_1 = round(runif(input$n_rows_table, 0, 10), 1),
val_2 = round(rnorm(input$n_rows_table), 2),
val_3 = round(rnorm(input$n_rows_table), 2),
val_4 = letters[1:input$n_rows_table],
Yes = "Yes",
No = "No",
Maybe = "Maybe",
result = NA # ideally the what ever selection in yes/no/maybe shows up in this column (future improvement)
) %>%
mutate(
Yes = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , Yes),
No = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , No),
Maybe = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , Maybe)
) })
output$datatable2 <- DT::renderDT({
# ---- only difference here is he lack of a drop down.
callback <- JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-radiogroup');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());")
datatable(
data_for_table2(),
escape = F,
rownames = F,
callback = callback,
options = list(
dom = 't',
paging = FALSE,
ordering = FALSE,
paging = FALSE,
searching = FALSE,
columnDefs = list(
# list(
# visible = FALSE,
# targets = c(ncol(data_for_table2())-1+0) # do not show certain ID variables, we do not need
# ),
list(
orderable = FALSE,
className = "details-control",
targets = 0
),
list(
className = "dt-left",
targets = "_all"
)
)
)
)
},
server = F)
list_results2 <- reactive({
list_values <- list()
for (i in unique(data_for_table2()$let_rowid)) {
list_values[[i]] <- paste0(i, ": ", input[[i]])
}
list_values
})
output$sel2 = renderPrint({
list_results2()
})
# make this regex working
list_results_all <- reactive({
list_values_all <- list()
for(i in names(input)[grepl("([a-z]{1}_)([0-9]{1,3})",names(input))]){
list_values_all[[i]] <- tibble(id = i, value = paste0(input[[i]]))
}
do.call(rbind, list_values_all)
})
output$sel_all = renderPrint({
list_results_all()
})
}
)
编辑(附加问题)
library(shiny)
library(DT)
library(shinyWidgets)
library(tidyverse)
# 1) These two function allows for setting a remove function in the app.
# This code is taken from here: https://stackoverflow.com/questions/53908266/r-shiny-remove-row-button-in-data-table
getRemoveButton <- function(n, idS = "", lab = "Pit") {
if (stringr::str_length(idS) > 0) idS <- paste0(idS, "-")
ret <- shinyInput(actionButton, n,
'button_', label = "Remove",
onclick = sprintf('Shiny.onInputChange(\"%sremove_button_%s\", this.id)' ,idS, lab))
return (ret)
}
shinyInput <- function(FUN, n, id, ses, ...) {
as.character(FUN(paste0(id, n), ...))
}
shinyApp(
ui = fluidPage(
title = 'Radio button and a dropdown manue ',
sliderInput("n_rows_table", "Number of rows:",
min = 0, max = 10,
value = 5),
actionBttn(
inputId = "btnCancel",
label = "Make tables",
size = "sm",
color = "warning"
),
p("THIS EXAMPLE DOES NOT WORK!"),
DT::dataTableOutput("datatable"),
verbatimTextOutput('sel'),
#p("THIS SIMPLER EXAMPLE DOES WORK!"),
#DT::dataTableOutput("datatable2"),
#verbatimTextOutput('sel2'),
#("These of the R6 input class objects, the the ones from the first tabel do not show up"),
#verbatimTextOutput('sel_all'),
),
server = function(input, output, session) {
# Ideally instead of working with a counter,
# this would just override the old value so instead of a_1, a_2,
# everything you click the button it just sets input$a back to null
# until the users clicks again.
# But in the meantime this is a work around
counter <- reactiveValues(countervalue = 0) # Defining & initializing the reactiveValues object
observeEvent(input$btnCancel, {
counter$countervalue <- counter$countervalue + 1 # if the add button is clicked, increment the value by 1 and update it
})
values <- reactiveValues(tab = NULL)
# ----- Create a table based on the number of rows from the slider
# ----- and create it when the user clicks the button
observeEvent(
input$btnCancel,
{
values$tab <- tibble(
let_rowid = paste0(letters[1:input$n_rows_table], "_", counter$countervalue ),
val_1 = round(runif(input$n_rows_table, 0, 10), 1),
val_2 = round(rnorm(input$n_rows_table), 2),
val_3 = round(rnorm(input$n_rows_table), 2),
val_4 = letters[1:input$n_rows_table],
Yes = "Yes",
No = "No",
Maybe = "Maybe",
result = NA # ideally the what ever selection in yes/no/maybe shows up in this column (future improvement)
) %>%
mutate(oplus = "⊕") %>%
relocate(oplus) %>%
mutate(
Yes = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , Yes),
No = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , No),
Maybe = sprintf('<input type="radio" name="%s" value="%s"/>', let_rowid , Maybe)
) %>%
## THIS IS NEW ###################################################
mutate(id = 1:n()) %>% #
rowwise() %>% #
mutate(Remove = getRemoveButton(id, idS = "", lab = "Tab1"))%>% #
ungroup() %>% #
##################################################################
nest(datalist = c(val_3, val_4)) %>%
mutate(datalist = map(datalist, as.list)) %>%
mutate(datalist = map(datalist, list))
})
# add a proxy table
proxyTable <- DT::dataTableProxy("tab")
# ----- Render the table
# ----- The table renders ok.
output$datatable <- DT::renderDT({
parentRows <- which(values$tab[,1] != "")
# ------ This JS is neede to make the child/parent dropdown
callback <- JS(
sprintf("var parentRows = [%s];", toString(parentRows-1)),
sprintf("var j0 = %d;", 0),
"var nrows = table.rows().count();",
"for(let i = 0; i < nrows; ++i){",
" var $cell = table.cell(i,j0).nodes().to$();",
" if(parentRows.indexOf(i) > -1){",
" $cell.css({cursor: 'pointer'});",
" }else{",
" $cell.removeClass('details-control');",
" }",
"}",
"",
"// --- make the table header of the nested table --- //",
"var formatHeader = function(d, childId){",
" if(d !== null){",
" var html = ",
" '<table class=\"display compact hover\" ' + ",
" 'style=\"padding-left: 30px;\" id=\"' + childId + ",
" '\"><thead><tr>';",
" var data = d[d.length-1] || d.datalist;",
" for(let key in data[0]){",
" html += '<th>' + key + '</th>';",
" }",
" html += '</tr></thead></table>'",
" return html;",
" } else {",
" return '';",
" }",
"};",
"",
"// --- row callback to style rows of child tables --- //",
"var rowCallback = function(row, dat, displayNum, index){",
" if($(row).hasClass('odd')){",
" $(row).css('background-color', 'papayawhip');",
" $(row).hover(function(){",
" $(this).css('background-color', '#E6FF99');",
" }, function(){",
" $(this).css('background-color', 'papayawhip');",
" });",
" } else {",
" $(row).css('background-color', 'lemonchiffon');",
" $(row).hover(function(){",
" $(this).css('background-color', '#DDFF75');",
" }, function(){",
" $(this).css('background-color', 'lemonchiffon');",
" });",
" }",
"};",
"",
"// --- header callback to style header of child tables --- //",
"var headerCallback = function(thead, data, start, end, display){",
" $('th', thead).css({",
" 'border-top': '3px solid indigo',",
" 'color': 'indigo',",
" 'background-color': '#fadadd'",
" });",
"};",
"",
"// --- make the datatable --- //",
"var formatDatatable = function(d, childId){",
" var data = d[d.length-1] || d.datalist;",
" var colNames = Object.keys(data[0]);",
" var columns = colNames.map(function(x){",
" return {data: x.replace(/\\./g, '\\\\\\.'), title: x};",
" });",
" var id = 'table#' + childId;",
" if(colNames.indexOf('datalist') === -1){",
" var subtable = $(id).DataTable({",
" 'data': data,",
" 'columns': columns,",
" 'autoWidth': true,",
" 'deferRender': true,",
" 'info': false,",
" 'lengthChange': false,",
" 'ordering': data.length > 1,",
" 'order': [],",
" 'paging': false,",
" 'scrollX': false,",
" 'scrollY': false,",
" 'searching': false,",
" 'sortClasses': false,",
" 'rowCallback': rowCallback,",
" 'headerCallback': headerCallback,",
" 'columnDefs': [{targets: '_all', className: 'dt-center'}]",
" });",
" } else {",
" var subtable = $(id).DataTable({",
" 'data': data,",
" 'columns': columns,",
" 'autoWidth': true,",
" 'deferRender': true,",
" 'info': false,",
" 'lengthChange': false,",
" 'ordering': data.length > 1,",
" 'order': [],",
" 'paging': false,",
" 'scrollX': false,",
" 'scrollY': false,",
" 'searching': false,",
" 'sortClasses': false,",
" 'rowCallback': rowCallback,",
" 'headerCallback': headerCallback,",
" 'columnDefs': [",
" {targets: -1, visible: false},",
" {targets: 0, orderable: false, className: 'details-control'},",
" {targets: '_all', className: 'dt-center'}",
" ]",
" }).column(0).nodes().to$().css({cursor: 'pointer'});",
" }",
"};",
"",
"// --- display the child table on click --- //",
"// array to store id's of already created child tables",
"var children = [];",
"table.on('click', 'td.details-control', function(){",
" var tbl = $(this).closest('table'),",
" tblId = tbl.attr('id'),",
" td = $(this),",
" row = $(tbl).DataTable().row(td.closest('tr')),",
" rowIdx = row.index();",
" if(row.child.isShown()){",
" row.child.hide();",
" td.html('⊕');",
" } else {",
" var childId = tblId + '-child-' + rowIdx;",
" if(children.indexOf(childId) === -1){",
" // this child has not been created yet",
" children.push(childId);",
" row.child(formatHeader(row.data(), childId)).show();",
" td.html('⊖');",
" formatDatatable(row.data(), childId, rowIdx);",
" }else{",
" // this child has already been created",
" row.child(true);",
" td.html('⊖');",
" }",
" }",
"}); ",
"// --- add radio button functionality --- //",
"table.rows().every(function(i, tab, row) {",
" var $this = $(this.node());",
" $this.attr('id', this.data()[1]);",
" $this.addClass('shiny-input-radiogroup');",
" });",
" Shiny.unbindAll(table.table().node());",
" Shiny.bindAll(table.table().node());")
datatable(
values$tab,
escape = F,
rownames = F,
callback = callback,
options = list(
dom = 't',
paging = FALSE,
ordering = FALSE,
paging = FALSE,
searching = FALSE,
columnDefs = list(
list(
visible = FALSE,
targets = c(c(1, ncol(values$tab)-1)) # do not show certain ID variables, we do not need
),
list(
orderable = FALSE,
className = "details-control",
targets = 0
),
list(
className = "dt-left",
targets = "_all"
)
)
)
) },
server = F)
observeEvent(input$remove_button_Tab1, {
myTable <- values$tab
s <- as.numeric(strsplit(input$remove_button_Tab1, "_")[[1]][2])
myTable <- filter(myTable, id != s)
replaceData(proxyTable, myTable, resetPaging = FALSE)
values$tab <- myTable
})
list_results <- reactive({
list_values <- list()
for (i in unique( values$tab$let_rowid)) {
list_values[[i]] <- paste0(i, ": ", input[[i]])
}
list_values
})
output$sel = renderPrint({
list_results()
})
####################################
## this simpler version does work ##
####################################
# removed for now
}
)
我尝试的另一件事(但没有奏效)
最佳答案
您分配错误 id
JavaScript 回调中的元素,因为在您的表中,第一列实际上是 &oplus
列,但您想要第二列。
从而改变这个
table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]); // this.data()[0] refers to the firts column, i.e. ⊕
$this.addClass('shiny-input-radiogroup');
});
对此:
table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[1]); // the id is in the second column in your case
$this.addClass('shiny-input-radiogroup');
});
关于javascript - 如何从 Shiny 的 DT 中的单选按钮(使用 JS 回调制作)访问用户输入,并在一个 DT 中有不同的 JS 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66264935/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!