Я хочу получить доступ и изменить текст TextView из неродительского файла.
Это класс, из которого я хотел бы внести изменения
class BarcodeProcessor(graphicOverlay: GraphicOverlay, private val workflowModel: WorkflowModel) :
FrameProcessorBase<List<FirebaseVisionBarcode>>() {
В этом классе нет onCreat()
Нужно ли иметь AppCompatActivity(), чтобы получить доступ к файлам макета xml?
Внутри этого файла обрабатывается штрих-код, и я могу отображать результаты вместе с SQL-запросом на консоли, но я хочу обновить интерфейс, чтобы отразить эти значения. Могу ли я передать их через объект-компаньон родительскому классу?
Есть ли способ обновить макет из файла BarcodeProcessor?
Я пробовал включать импорт
import kotlinx.android.synthetic.main.barcode_field.*
@MainThread
override fun onSuccess(
image: FirebaseVisionImage,
results: List<FirebaseVisionBarcode>,
graphicOverlay: GraphicOverlay
) {
var z = ""
var isSuccess: Boolean? = false
//Variables used in the SQL query
var strData = ""
var strData2 = ""
try {
con = dbConn() // Connect to database
if (con == null) {
z = "Check Your Internet Access!"
} else {
val query = "select [ValueOne], [ValueTwo] from [TableName] where [ValueOne] = '$barcodeValue'"
val stmt = con!!.createStatement()
val cursor = stmt.executeQuery(query)
barcodeValue = results[0].getRawValue()!!
println(barcodeValue)
if (cursor.next()) {
//Selects the values from the columns in the table where the query is taking place
strData = cursor.getString("[ValueOne]")
strData2 = cursor.getString("[ValueTwo]")
var finalDispositionID = strData
var moduleSizeID = strData2
println(finalDispositionID)
println(moduleSizeID)
//barcode_field_value3 is the name of the textview
//barcode_field_value2 is the name of the other textview
//barcode_field_value3.text = strData
z = "Login successful"
isSuccess = true
con!!.close()
} else {
z = "Invalid Credentials!"
isSuccess = false
}
}
} catch (ex: java.lang.Exception) {
isSuccess = false
z = ex.message!!
}
Запрос происходит в функции onSuccess(). Я включил весь файл для справки.
private fun setUpWorkflowModel() {
workflowModel = ViewModelProviders.of(this).get(WorkflowModel::class.java)
// Observes the workflow state changes, if happens, update the overlay view indicators and
// camera preview state.
workflowModel!!.workflowState.observe(this, Observer { workflowState ->
if (workflowState == null || Objects.equal(currentWorkflowState, workflowState)) {
return@Observer
}
currentWorkflowState = workflowState
Log.d(TAG, "Current workflow state: ${currentWorkflowState!!.name}")
val wasPromptChipGone = promptChip?.visibility == View.GONE
when (workflowState) {
WorkflowState.DETECTING -> {
promptChip?.visibility = View.VISIBLE
promptChip?.setText(R.string.prompt_point_at_a_barcode)
startCameraPreview()
}
WorkflowState.CONFIRMING -> {
promptChip?.visibility = View.VISIBLE
promptChip?.setText(R.string.prompt_move_camera_closer)
startCameraPreview()
}
WorkflowState.SEARCHING -> {
promptChip?.visibility = View.VISIBLE
promptChip?.setText(R.string.prompt_searching)
stopCameraPreview()
}
WorkflowState.DETECTED, WorkflowState.SEARCHED -> {
promptChip?.visibility = View.GONE
stopCameraPreview()
}
else -> promptChip?.visibility = View.GONE
}
val shouldPlayPromptChipEnteringAnimation = wasPromptChipGone && promptChip?.visibility == View.VISIBLE
promptChipAnimator?.let {
if (shouldPlayPromptChipEnteringAnimation && !it.isRunning) it.start()
}
})
workflowModel?.detectedBarcode?.observe(this, Observer { barcode ->
if (barcode != null) {
val barcodeFieldList = ArrayList<BarcodeField>()
barcodeFieldList.add(BarcodeField("Module Serial Number", barcode.rawValue ?: ""))
BarcodeResultFragment.show(supportFragmentManager, barcodeFieldList)
}
})
}```
@Фартаб да. Когда штрих-код сканируется, он берет необработанное значение, выполняет для него запрос MSSQL и отправляет обратно два значения. Эти значения будут отображаться внутри двух TextView.
покажите код, где эти два значения были получены, тогда я могу помочь
Я добавил содержимое всего файла, но вы хотите заглянуть внутрь функции onSuccess()
Вы устанавливаете workflowModel.detectedBarcode оперативные данные в BarcodeProcessor. Таким образом, вы можете найти, где вы передаете этот конструктор workflowModel to BarcodeProcessor, и добавить такой код, чтобы наблюдать за этими данными в реальном времени в вашей деятельности:
workflowModel.detectedBarcode.observe(this, Observer {
myTextView.text = it
})
Итак, внутри моего основного «LiveBarcodeScanningActivity.kt» есть модель рабочего процесса. workflowModel?.detectedBarcode?.observe(this, Observer { штрих-код -> if (штрих-код!= null) { val barcodeFieldList = ArrayList<BarcodeField>() barcodeFieldList.add(BarcodeField("Серийный номер модуля", barcode.rawValue ?: " ")) BarcodeResultFragment.show(supportFragmentManager, barcodeFieldList) } }) могу ли я добавить наблюдателя под этим и изменить его на свои переменные, содержащие данные запроса?
да .. добавьте код ответа в onCreate из LiveBarcodeScanningActivity ниже звонка setUpWorkflowModel()
Кажется, вы уже наблюдаете detectedBarcode живые данные. вы можете добавить свой код в существующий наблюдатель или создать новый наблюдатель.
Я добавил свой код наблюдателя выше. Основная часть находится внизу. Для строки myTextView.text = it будет ли myTextView именем textView в макете xml? и установить ли его равным значению из файла BarcodeProcessor?
да .. это то же текстовое представление в вашем xml. назовите его соответственно.
Извините, уточняю. it должно ли это быть значение из файла BarcodeProcessor? Это появляется как несоответствие типов, оставляя его как есть.
Я вижу, вы назвали it как barcode. так что сделай это: myTextView.text = barcode
Через некоторое время экспериментов я все еще не могу передать значения через
в чем твоя проблема сейчас? у тебя ошибка компиляции?
Я просто не мог это реализовать. Я попробовал вышеописанное, а затем создал новый класс внутри файла, чтобы он действовал как get/set, и сделал их наблюдаемыми, но с ним ничего не произошло. Или я бы получил java.lang.IllegalStateException: barcode_field_value3 must not be null
Этот ответ относится непосредственно к отображению результатов в примере проекта Google Витрина ML-Kit. Так что, если вы работаете над этим со сканированием штрих-кода, это связано.
Для отображения результатов при успешном сканировании необходимо добавить поля в
internal class BarcodeFieldViewHolder private constructor(view: View) : RecyclerView.ViewHolder(view) {
private val labelView: TextView = view.findViewById(R.id.barcode_field_label)
private val valueView: TextView = view.findViewById(R.id.barcode_field_value)
private val moduleSize: TextView = view.findViewById(R.id.textViewModuleSize)
private val finalDisposition: TextView = view.findViewById(R.id.textViewFinalDisp)
private val NCRNotes: TextView = view.findViewById(R.id.textViewNCR)
private val OverlapLengthText: TextView = view.findViewById((R.id.textViewOverlapLength))
fun bindBarcodeField(barcodeField: BarcodeField) {
//These are the original values that display in the Barcode_field.xml
labelView.text = barcodeField.label
valueView.text = barcodeField.value
//These are the new values I passed in
moduleSize.text = BarcodeProcessor.data.moduleSize
finalDisposition.text = BarcodeProcessor.data.finalDisposition
NCRNotes.text = BarcodeProcessor.data.NCRNotes
OverlapLengthText.text = BarcodeProcessor.data.OverlapLength
}
Внутри
объявить объект данных
object data {
var finalDisposition = "init"
var moduleSize = "init"
var barcodeValue: String = ""
var NCRNotes = ""
var OverlapLength = ""
}
Эти переменные будут переданы в файл BarcodeFieldAdapter выше, а затем отобразятся в barcode_field.xml в случае успеха.
Внутри функции запроса - в файле BarcodeProcessor
//Selects the values from the columns in the table where the query is taking place
strData = cursor.getString("Column Name 1")
strData2 = cursor.getString("Column Name 2")
strData4 = cursor.getString("Column Name 3")
//Assigns the values to the variables inside the object data
data.finalDisposition = strData
data.moduleSize = strData2
data.OverlapLength = strData4
data.NCRNotes = ""
Наконец, внутри файла barcode_field.xml создайте TextViews с (R.id.TextViewNAMES), которые показаны выше в файле BarcodeFieldAdapter. Теперь при успешном сканировании будут отображаться новые значения из запроса.
вы используете
LiveDataв своем приложении?