.text ничего не печатает, а .append - PullRequest
0 голосов
/ 17 апреля 2020
private fun testing (data: CharSequence) {
        runOnUiThread{

            test!!.text = data
            textView!!.append(data)
        }
    }

Два разных textView, называемых test и textView. Моя цель - использовать .text для печати переменной данных в textView. К сожалению, это не похоже на работу. Странно .append работает, но я хочу, чтобы данные печатались, а затем перезаписывались при любых новых изменениях.

Изображение моего приложения для более легкого понимания ситуации

Здесь на рисунке выше вы можете видеть, что второй textView работает нормально с .append. Но вышеприведенный textView, использующий .text, ничего не печатает? Почему эта

переменная данных поступает от Arduino Board. Вот мой код

var mCallback = UsbReadCallback { arg0 ->
        //Defining a Callback which triggers whenever data is read.
        var data: String? = null
        try {
            data = String(arg0, Charsets.UTF_8)
            "$data/n"
            testing(data)
            tvAppend(textView, data)
        } catch (e: UnsupportedEncodingException) {
            e.printStackTrace()
        }
    }

Это как-то связано с CharSequence? Может кто-нибудь помочь

Вот мой XML файл:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".Surfboard"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/surfboard"
    >

        <!--Table Layout with 3 rows and each row with 3 buttons-->
        <TableLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerInParent="true"
            android:rowCount="3"
            android:columnCount="3"
            android:padding="8dp"
            >

            <Button
                android:id="@+id/buttonStart"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onClickStart"
                android:text="@string/Begin"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/statusText"
                android:layout_below="@+id/buttonSend"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignParentBottom="true" />



            <!--Row 1-->
            <TableRow>

                <Button
                    android:id="@+id/b00"
                    style="@style/Widget.AppCompat.Button"
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:layout_margin="8dp"
                    android:gravity="center"
                    android:background="@color/colorAccent"
                    android:textColor="#FFFFFF"
                    android:textSize="22sp" />

                <Button
                    android:id="@+id/b01"
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:layout_margin="8dp"
                    android:background="@color/colorAccent"
                    android:gravity="center"
                    android:textColor="#FFFFFF"
                    android:textSize="22sp" />

                <Button
                    android:id="@+id/b02"
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:textSize="22sp"
                    android:textColor="#FFFFFF"
                    android:background="@color/colorAccent"
                    android:gravity="center"
                    android:layout_margin="8dp"
                    style="@style/Widget.AppCompat.Button"
                    />

            </TableRow>

            <Button
                android:id="@+id/activate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/activate"
                android:onClick="onClickSend"
                tools:ignore="OnClick" />

            <Button
                android:id="@+id/deactivate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="onClickStop"
                android:text="@string/deactivate"/>

            <TextView
                android:id="@+id/test"
                android:layout_width="wrap_content"
                android:background="#E0E0E0"
                android:layout_height="wrap_content"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/textView"
                android:layout_below="@+id/buttonSend"
                android:layout_marginTop="20dp"
                android:background="#E0E0E0" />

        </TableLayout>

</RelativeLayout>

Вот я, инициирующий TextViews:

var textView: TextView? = null
var textView2: TextView? = null

textView = findViewById<View>(R.id.textView) as TextView
 textView2 = findViewById<View>(R.id.test) as TextView

Вот также видео, чтобы помочь объяснить : https://youtu.be/LaMsjB7v5WI

Вот мой tvAppend:

private fun tvAppend(tv: TextView?, text: CharSequence) {
    runOnUiThread {
        //tv!!.append(text)
     }
}

В основном так же, как функция проверки (). Это ничего не делает, я прокомментировал действие.

Возможно, я должен предоставить весь свой код:

package com.example.surf10

import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_surfboard.*

import android.app.Activity
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.hardware.usb.UsbDevice
import android.hardware.usb.UsbDeviceConnection
import android.hardware.usb.UsbManager
import android.util.Log
import android.widget.EditText
import android.widget.TextView
import com.felhr.usbserial.UsbSerialDevice
import com.felhr.usbserial.UsbSerialInterface
import com.felhr.usbserial.UsbSerialInterface.UsbReadCallback
import kotlinx.android.synthetic.main.activity_surf_board2.*
import java.io.UnsupportedEncodingException



class Surfboard : AppCompatActivity() {

    val ACTION_USB_PERMISSION = "com.hariharan.arduinousb.USB_PERMISSION"
    var startButton: Button? = null
    var sendButton: Button? = null
    var stopButton: Button? = null
    var textView: TextView? = null
    var textView2: TextView? = null
    var statusText: TextView? = null
    var usbManager: UsbManager? = null
    var device: UsbDevice? = null
    var serialPort: UsbSerialDevice? = null
    var connection: UsbDeviceConnection? = null



    var mCallback = UsbReadCallback { arg0 ->
        //Defining a Callback which triggers whenever data is read.
        var data: String? = null
        try {
            data = String(arg0, Charsets.UTF_8)
            "$data/n"
            testing(data)
            tvAppend(textView, data)
        } catch (e: UnsupportedEncodingException) {
            e.printStackTrace()
        }
    }

    private val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
        //Broadcast Receiver to automatically start and stop the Serial connection.
        override fun onReceive(
            context: Context,
            intent: Intent
        ) {
            if (intent.action == ACTION_USB_PERMISSION) {
                val granted = intent.extras!!.getBoolean(
                    UsbManager.EXTRA_PERMISSION_GRANTED
                )
                if (granted) {
                    connection = usbManager!!.openDevice(device)
                    serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection)
                    if (serialPort != null) {
                        if (serialPort!!.open()) { //Set Serial Connection Parameters.
                            setUiEnabled(true)
                            serialPort!!.setBaudRate(9600)
                            serialPort!!.setDataBits(UsbSerialInterface.DATA_BITS_8)
                            serialPort!!.setStopBits(UsbSerialInterface.STOP_BITS_1)
                            serialPort!!.setParity(UsbSerialInterface.PARITY_NONE)
                            serialPort!!.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF)
                            serialPort!!.read(mCallback)
                            tvAppend(statusText, "Serial Connection Opened!\n")
                        } else {
                            Log.d("SERIAL", "PORT NOT OPEN")
                        }
                    } else {
                        Log.d("SERIAL", "PORT IS NULL")
                    }
                } else {
                    Log.d("SERIAL", "PERM NOT GRANTED")
                }
            } else if (intent.action == UsbManager.ACTION_USB_DEVICE_ATTACHED) {
                onClickStart(startButton)
            } else if (intent.action == UsbManager.ACTION_USB_DEVICE_DETACHED) {
                onClickStop(stopButton)
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_surfboard)

        usbManager = getSystemService(Context.USB_SERVICE) as UsbManager
        startButton = findViewById<View>(R.id.buttonStart) as Button
        sendButton = findViewById<View>(R.id.activate) as Button
        stopButton = findViewById<View>(R.id.deactivate) as Button
        textView = findViewById<View>(R.id.textView) as TextView
        textView2 = findViewById<View>(R.id.test) as TextView
        statusText = findViewById<View>(R.id.statusText) as TextView

        setUiEnabled(false)
        val filter = IntentFilter()
        filter.addAction(ACTION_USB_PERMISSION)
        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
        registerReceiver(broadcastReceiver, filter)

    }

    fun setUiEnabled(bool: Boolean) {
        startButton!!.isEnabled = !bool
        sendButton!!.isEnabled = bool
        stopButton!!.isEnabled = bool
        textView!!.isEnabled = bool
        textView2!!.isEnabled = bool
    }

    fun onClickStart(@Suppress("UNUSED_PARAMETER")view: View?) {
        val usbDevices = usbManager!!.deviceList
        if (!usbDevices.isEmpty()) {
            var keep = true
            for ((_, value) in usbDevices) {
                device = value
                val deviceVID = device!!.vendorId
                if (deviceVID == 0x2341) //Arduino Vendor ID
                {
                    val pi =
                        PendingIntent.getBroadcast(this, 0, Intent(ACTION_USB_PERMISSION), 0)
                    usbManager!!.requestPermission(device, pi)
                    keep = false
                } else {
                    connection = null
                    device = null
                }
                if (!keep) break
            }
        }
    }

    fun onClickSend(@Suppress("UNUSED_PARAMETER")view: View?) {
        val string = "g"
        serialPort!!.write(string.toByteArray())
        //tvAppend(textView, "\nData Sent : " + string)
    }

    fun onClickStop(@Suppress("UNUSED_PARAMETER")view: View?) {
        setUiEnabled(false)
        serialPort!!.close()
        tvAppend(textView, "\nSerial Connection Closed! \n")
    }

    private fun tvAppend(tv: TextView?, text: CharSequence) {
        runOnUiThread {
            //tv!!.append(text)
         }
    }

    private fun testing (data: CharSequence) {



        runOnUiThread{
            textView!!.text = data.toString() <---- THIS DOES NOT WORK

            textView2!!.append(data)
        }
    }


}

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020
private fun testing (data: CharSequence) {

    runOnUiThread {
Log.d("Test Function","on testing function call")
        test!!.text = data.toString()  <<<<<--- Edited
        textView!!.text = data.toString()   
    }
}

Не могли бы вы зарегистрировать эту функцию, чтобы увидеть, действительно ли она вызывает эту функцию при нажатии кнопки

0 голосов
/ 19 апреля 2020

извините за поздний повтор, не могли бы вы попробовать еще раз, чтобы увидеть, работает ли он

сначала удалите этот импорт

import kotlinx.android.synthetic.main.activity_surf_board2.*

и посмотрите снова запустить, чтобы увидеть, работает ли он еще

после этого

private fun tvAppend(tv: TextView?, text: CharSequence) {
        runOnUiThread {
            test.text = text.toString()  <----- add this line
            tv!!.append(text)
         }
    }



fun onClickSend(@Suppress("UNUSED_PARAMETER")view: View?) {
        val string = "g"
        serialPort!!.write(string.toByteArray())
        tvAppend(textView, "\nData Sent : " + string)
    }

и запустить снова, теперь должно работать

0 голосов
/ 17 апреля 2020
private fun testing (data: CharSequence) {
    runOnUiThread {
        test!!.text = data.toString()  <<<<<--- Edited
        textView!!.text = data.toString()   
    }
}

хорошо, теперь я думаю, что понимаю ваш вопрос

вам нужно привести данные: сначала выполните CharSequence to String, выполнив .toString (), а someTextView.text также является CharSequence, что означает, что если вы хотите использовать test !!. текстовое значение в виде строки необходимо преобразовать в .toString

, поэтому

 test!!.text = data.toString()
 textView!!.text = test!!.text.toString()

это пример, если вы хотите что-то изменить в тесте !!. сначала текст

private fun testing (data: CharSequence) {
var castDataToString = data.toString()
test!!.text = castDataToString
castDataToString = "New vaule"
textView!!.text = castDataToString 
}

или на самом деле вы можете изменить это на

    private fun testing (data: String) {

            test!!.text = data
            var changedText : String = test!!.text.toString()
//or  var changedText = data   since it's the same as text!!.text.toString()

            changedText = "change to something you want"
            textView!!.text = changedText

    }

, так как метод тестирования уже получает параметр в виде String, поэтому вам не нужно снова приводить его внутрь, но помните, что если вы хотите получить строковое значение из someTextView, вам нужно вызвать someTextView.text.toString ()

...