繁体   English   中英

.text 不打印任何东西,但.append 确实

[英].text does not print anything, yet .append does

private fun testing (data: CharSequence) {
        runOnUiThread{

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

两个不同的 textViews 称为 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)
     }
}

与 function testing() 基本相同。 这没有做任何事情,我已经注释掉了这个动作。

也许我应该提供我所有的代码:

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)
        }
    }


}
private fun testing (data: CharSequence) {
    runOnUiThread {
        test!!.text = data.toString()  <<<<<--- Edited
        textView!!.text = data.toString()   
    }
}

好的,现在我想我明白你的问题了

您需要先通过 do.toString() 将 data:CharSequence 转换为 String ,而 someTextView.text 也是 CharSequence 如果您想使用 test...text 值作为 String 您需要将其转换为 .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()

private fun testing (data: CharSequence) {

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

你能记录这个 function 看看当你点击按钮时它是否真的叫这个 function

抱歉重播晚了,你可以再试一次,看看它是否有效

首先删除此导入

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)
    }

现在再次运行它应该可以工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM