【问题标题】:.text does not print anything, yet .append does.text 不打印任何内容,但 .append 可以
【发布时间】:2020-04-16 22:02:48
【问题描述】:
private fun testing (data: CharSequence) {
        runOnUiThread{

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

两个不同的 textView 分别称为 test 和 textView。我的目标是使用 .text 将数据变量打印到 textView。不幸的是,这似乎不想工作。奇怪的是 .append 有效,但我希望打印数据,然后被任何新更改覆盖。

Image of my app for easier understanding of the situation

在上图中,您可以看到第二个 textView 与 .append 一起工作正常。但是上面使用 .text 的 textView 没有打印任何东西?这是为什么

数据变量来自 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)
     }
}

与函数 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)
        }
    }


}

【问题讨论】:

    标签: java android-studio kotlin textview charsequence


    【解决方案1】:
    private fun testing (data: CharSequence) {
        runOnUiThread {
            test!!.text = data.toString()  <<<<<--- Edited
            textView!!.text = data.toString()   
        }
    }
    

    好吧,我想我明白你的问题了

    您需要先将 data:CharSequence 转换为 String 通过做 .toString() 并且 someTextView.text 也是 CharSequence 意思是如果你想使用 test!!.text 值作为字符串 您需要将其转换为 .toString

    所以

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

    这是一个例子 如果你想在测试中改变一些东西!!.text first

    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
    
        }
    

    由于方法测试已经将参数作为字符串接收,因此您无需再次将其转换为内部 但 记住如果你想从 someTextView 获取字符串值 你需要调用 someTextView.text.toString()

    【讨论】:

    • .text 不打印任何内容。 .append 只是一个示例,显示此 textView 打印数据,因此变量数据不是问题。我不想使用.append 但.text。虽然 .append 打印数据,但不断附加到前一个文本,. text 根本不打印任何东西。 .text 应该打印数据变量,然后再次调用,覆盖该文本视图中的任何内容。为什么 .append 有效,但 .text 不打印任何内容?
    • 我在上面的图片中添加了帮助更清楚地解释自己
    • 抱歉,感谢您抽出宝贵时间,但这不是我的问题。我不是要更改 .append,.append 只是为了表明它有效。 .append 打印数据变量。我的问题是, .text 不打印数据变量。请忘记 .append 的存在。如果我将 toString() 分配给 .text ,这仍然不起作用 - >为什么 .text 没有打印出任何内容,而 .append 呢?如果您需要更好的解释,我可以向 youtube 提交视频
    • 我在我的 xml 和视频中添加了帮助解释 - 谢谢!
    • 我可以看看你的 tvAppend(textView, data) 方法吗
    【解决方案2】:
    private fun testing (data: CharSequence) {
    
        runOnUiThread {
    Log.d("Test Function","on testing function call")
            test!!.text = data.toString()  <<<<<--- Edited
            textView!!.text = data.toString()   
        }
    }
    

    你可以记录这个函数,看看当你点击按钮时它是否真的调用了这个函数

    【讨论】:

    • 通过吐司,我可以确认这个函数正在被调用
    【解决方案3】:

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

    首先删除这个导入

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多