Как получить доступ к TextView из неродительского файла [Android]

Я хочу получить доступ и изменить текст 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(). Я включил весь файл для справки.

LiveBarcodeScanningActivity

    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)

            }
        })

    }```

вы используете LiveData в своем приложении?

Fartab 16.07.2019 16:02

@Фартаб да. Когда штрих-код сканируется, он берет необработанное значение, выполняет для него запрос MSSQL и отправляет обратно два значения. Эти значения будут отображаться внутри двух TextView.

AndroidBuild 16.07.2019 16:10

покажите код, где эти два значения были получены, тогда я могу помочь

Fartab 16.07.2019 16:23

Я добавил содержимое всего файла, но вы хотите заглянуть внутрь функции onSuccess()

AndroidBuild 16.07.2019 16:31
0
4
108
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы устанавливаете 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) } }) могу ли я добавить наблюдателя под этим и изменить его на свои переменные, содержащие данные запроса?

AndroidBuild 16.07.2019 16:51

да .. добавьте код ответа в onCreate из LiveBarcodeScanningActivity ниже звонка setUpWorkflowModel()

Fartab 16.07.2019 16:53

Кажется, вы уже наблюдаете detectedBarcode живые данные. вы можете добавить свой код в существующий наблюдатель или создать новый наблюдатель.

Fartab 16.07.2019 16:55

Я добавил свой код наблюдателя выше. Основная часть находится внизу. Для строки myTextView.text = it будет ли myTextView именем textView в макете xml? и установить ли его равным значению из файла BarcodeProcessor?

AndroidBuild 16.07.2019 17:01

да .. это то же текстовое представление в вашем xml. назовите его соответственно.

Fartab 16.07.2019 17:03

Извините, уточняю. it должно ли это быть значение из файла BarcodeProcessor? Это появляется как несоответствие типов, оставляя его как есть.

AndroidBuild 16.07.2019 17:12

Я вижу, вы назвали it как barcode. так что сделай это: myTextView.text = barcode

Fartab 16.07.2019 17:15

Через некоторое время экспериментов я все еще не могу передать значения через

AndroidBuild 16.07.2019 19:16

в чем твоя проблема сейчас? у тебя ошибка компиляции?

Fartab 16.07.2019 19:17

Я просто не мог это реализовать. Я попробовал вышеописанное, а затем создал новый класс внутри файла, чтобы он действовал как get/set, и сделал их наблюдаемыми, но с ним ничего не произошло. Или я бы получил java.lang.IllegalStateException: barcode_field_value3 must not be null

AndroidBuild 16.07.2019 19:22
Ответ принят как подходящий

Этот ответ относится непосредственно к отображению результатов в примере проекта Google Витрина ML-Kit. Так что, если вы работаете над этим со сканированием штрих-кода, это связано.

Для отображения результатов при успешном сканировании необходимо добавить поля в

Файл BarcodeFieldAdapter

    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. Теперь при успешном сканировании будут отображаться новые значения из запроса.

Другие вопросы по теме