[英].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.