首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin TextView width -只有创建视图层次结构的原始线程才能接触它的视图

基础概念

在Android开发中,视图(View)是用户界面的基本构建块,而TextView是用于显示文本的视图组件。每个视图都有一个与之关联的线程,通常是UI线程(主线程),它负责视图的创建、更新和销毁。这是因为Android的UI组件不是线程安全的,所以所有的UI操作都必须在同一个线程中执行。

问题原因

当你尝试在非UI线程中访问或修改TextView的宽度时,会抛出异常,提示“只有创建视图层次结构的原始线程才能接触它的视图”。这是因为Android系统强制要求所有对UI组件的访问都必须在UI线程中进行。

解决方法

有几种方法可以解决这个问题:

  1. 使用Handler:在UI线程中创建一个Handler,然后在非UI线程中使用这个Handler来发送消息,UI线程接收到消息后执行相应的UI更新操作。
代码语言:txt
复制
val handler = Handler(Looper.getMainLooper()) { message ->
    val textView = findViewById<TextView>(R.id.textView)
    textView.width = message.arg1
}

// 在非UI线程中
val msg = Message.obtain()
msg.arg1 = newWidth
handler.sendMessage(msg)
  1. 使用runOnUiThread:如果你当前在一个Activity中,可以使用runOnUiThread方法来确保代码在UI线程中执行。
代码语言:txt
复制
runOnUiThread {
    val textView = findViewById<TextView>(R.id.textView)
    textView.width = newWidth
}
  1. 使用View.post:TextView提供了一个post方法,可以在UI线程中异步执行代码块。
代码语言:txt
复制
val textView = findViewById<TextView>(R.id.textView)
textView.post {
    textView.width = newWidth
}

应用场景

这个问题通常出现在后台线程中需要更新UI的场景,例如网络请求完成后更新界面显示的数据。

参考链接

通过以上方法,你可以确保在非UI线程中对TextView宽度的修改操作是在UI线程中安全执行的。

相关搜索:原生React:“只有创建视图层次结构的原始线程才能接触它的视图”KOTLIN : android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触它的视图如何解决错误:只有创建视图层次结构的原始线程才能接触它的视图如何修复错误“只有创建了视图层次结构的原始线程才能接触它的视图。”如何在Kotlin中解决“只有创建了视图层次结构的原始线程才能接触到它的视图”?CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及视图如何解决只有创建了视图层次结构的原始线程才能接触到它的视图?android.view.ViewRootImpl$CalledFromWrongThreadException:Only创建视图层次结构的原始线程可以接触它的视图只有创建视图层次结构的原始线程才能接触它的视图,我尝试移动到UI线程,但似乎什么都不起作用在片段中设置ProgressBar可见性时出错,只有创建视图层次结构的原始线程才能接触其视图在OnCreate方法Xamarin.Android中使用线程时,只有创建视图层次结构的原始线程才能接触其视图异常当我点击浮动的操作按钮时,我的应用程序崩溃:只有创建视图层次结构的原始线程才能接触它的视图当我运行我的代码时,出现一条错误消息:只有创建视图层次结构的原始线程才能接触它的视图。如何修复它?获取一个奇怪的“只有创建视图层次结构的原始线程才能接触到它的视图。”我的android天气应用程序出错“只有创建视图层次结构的原始线程才能访问其视图。”在我的情况下,如何解决这个崩溃?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android Compose开发

声明式 UI,通过对比可以看到 Kotin DSL 有诸多好处: 有着近似 XML 结构化表现力 较少字符串,更多强类型,更安全 可提取 linearLayoutParams 这样对象方便复用...另外 Compose 里代码基本都是可以被混淆,所以开启混淆之后代码压缩率也很高。 手动操纵视图会提高出错可能性。如果一条数据在多个位置呈现,很容易忘记更新显示某个视图。...允许您在应用程序中创建水平滑动页面布局,类似于 ViewPager 或 RecyclerView。...控制了视图在屏幕上显示顺序。具有较高 zIndex 值视图将显示在具有较低 zIndex 值视图之上。 默认情况下,视图 zIndex 值为0。...副作用操作通常包括异步任务、网络请求、数据库操作或其他可能会阻塞主线程操作。 LaunchedEffect 函数是一个协程构建器,接受一个或多个参数,并在代码块中执行异步操作。

32710
  • 线程与更新UI,细谈原理

    (DOM是一种文档对象模型,他层次结构是除了顶级元素,所有元素都被包括到另外元素节点中,有点像家谱树结构,很典型就是html代码解析) 到这里,一个有完整view结构DecorView就创建出来了...."); } } 可以看到是因为当前线程currentThread不是mThread时候,就会崩溃,报错误是 “只有创建视图层次结构原始线程才能触摸视图” ,看到这里是不是猜到一些了...,这个mThread难道就是“创建视图原始线程”?...翻译还是比较准确只有创建视图原始线程才能修改这个视图,听起来也蛮有道理,我创造了你才有权利改变你,有那味了。...setText方法中调用了TextViewsetText()方法,然后由于Toast中TextView宽高都是wrap_content,所以会触发requestLayout方法,最后会调用到最上层

    83720

    Android使用ViewBinding

    前言 原始方式 在我们开发过程中,需要获取XML布局文件中ViewId,以便其赋值显示,我们习惯使用findViewById进行操作,可这样会导致很多模版代码出现。...ViewBinding和Kotlin扩展 ViewBinding 和 Kotlin 扩展 都是 Android 开发中常用技术,用于简化视图查找和绑定过程。...ViewBinding 可以生成类型安全代码,避免了手动查找和强制转换视图对象麻烦。 ViewBinding 不会增加 APK 大小,因为只是编译时生成代码。...Kotlin扩展 使用起来相对简单,可以直接在布局文件中使用 Kotlin 扩展函数来查找和操作视图。...Kotlin扩展 对视图数据获取和类型安全性没有提供直接支持,需要手动处理可能空指针异常和类型转换。 Kotlin扩展 会增加 APK 大小,因为它是在运行时动态添加函数。

    62521

    Kotlin学习日志(六)控件使用

    1.1 按钮Button Button是Android常用控件之一,我在前面的文章就提到过Button Kotlin学习日志(一)TextView、Button、Toast使用 我们看一下使用代码...只不过由于多数情况用不到视图对象,因此在Kotlin中把冗余视图入参给省略了,但是为了弄清楚按钮事件来龙去脉,还是有必要观察一下本来面貌,接下来依次介绍按钮事件三种Kotlin编码方式:匿名函数...此时函数体代码中还有两个值得注意地方: (1)因为视图View是基本视图类型,并不存在文本属性,所以需要把这个视图对象变量类型转换为按钮Button,然后才能得到按钮对象文本,Kotlin类型转换通过关键字...单选按钮RadioButton默认是未选中状态,点击则显示选中状态,但是再次点击并不会取消选择,只有点击同组其他单选按钮,原来选中单选按钮才会被取消选中。...通过setInputType方法,可以过滤合法输入字符,只有符合输入类型字符,才允许接收并显示出来,而Kotlin可以直接给inputType属性设置输入类型,从而取代setInputType方法调用

    1.8K30

    实战 | 认识 RecyclerView

    虽然 RecyclerView 组成结构乍一看有些复杂,但是深入理解以后您会发现其实非常简单明了。 本文会通过创建一个简单 RecyclerView 实现一个列表来显示不同种类名字。...RecyclerView 是一个容器,它用于显示列表形式 (list) 或者网格形式 (grid) 数据,比如文本或者照片。 当列表滑动时候,实际上只有少量邻近视图会显示在屏幕上。...当视图滑出屏幕时,RecyclerView 会复用它并且填充新数据。由于它是通过回收已有的结构而不是持续创建列表项,所以它可以有效提高应用时间效率和空间效率。...首先在 Android Studio 里创建一个工程,并且使用 Empty Activity 模板。设置项目名称,并且选择 Kotlin 作为项目所用语言。...在 ViewHolder 中,创建一个变量来引用 TextView,然后将它指向表项布局里对应视图

    1.3K30

    《Kotin 极简教程》第13章 使用 Kotlin 和 Anko Android 开发

    Anko是一个 Kotlin 库, 使 android 应用程序开发变得更快、更容易。使您代码更加简单干净, 易于阅读。...那么要如何才能Kotlin环境中使用ButterKnife呢? 在早些时候,ButterKnife作者已经帮我们想好解决方案了,那就是——KotterKnife,见名知意。...,我们视图注入代码如下 val todoTitle: TextView by bindView(R.id.todo_item_todo_title) val todoContent: TextView...在 verticalLayout 代码段内部,创建了三个Android控件 - 两个 editText 视图和一个 button 视图。这里视图属性都在一行里面设置好了。...这些 ids 需要手工在一个加做 ids.xml 文件里创建,这个文件放在 app/src/main/res/values/ids.xml。如果这个文件不存在就创建。文件内容如下: <?

    3.5K30

    Android性能优化(二)之布局优化面面观

    作为开发人员,我们目标只有一个:保证稳定帧率来避免卡顿。...四、减少嵌套层次及控件个数 Android布局文件加载是LayoutInflater利用pull解析方式来解析,然后根据节点名通过反射方式创建出View对象实例; 同时嵌套子View位置受父View...,但是明显只使用TextView来做:嵌套层次、控件个数都更少。...Android定义了ViewStub类,ViewStub是轻量级且不可见视图没有大小,没有绘制功能,也不参与measure和layout,资源消耗非常低。...八、总结 布局优化通用套路 调试GPU过度绘制,将Overdraw降低到合理范围内; 减少嵌套层次及控件个数,保持view树形结构尽量扁平(使用Hierarchy Viewer可以方便查看),同时移除所有不需要渲染

    90930

    常用Android布局文件优化技巧总结

    Android 布局加载是 Android 应用程序重要组成部分。布局加载是指将 XML 文件中定义视图层次结构加载到内存中。...这些属性可以用来控制视图元素在布局中位置和大小。 布局文件解析过程 当应用程序启动时,Android 系统会将布局文件解析成一个视图层次结构,然后将其加载到内存中。...逐行解析 XML 文件,创建相应视图对象,并设置视图对象属性。 将所有视图对象组织成一个视图层次结构。 在解析布局文件时,Android 系统会使用反射机制来动态地创建视图对象。...merge 标签可以将多个视图容器合并成一个视图容器,从而减少视图层次结构深度和内存占用率。.../> 使用 merge 标签可以将线性布局和文本视图合并为一个布局容器,从而减少视图层次结构深度和内存占用率。

    24020

    android学习笔记----定时问题

    和控件操作都不是线程安全,所以Android才会禁止在非UI线程更新UI,对于显式非法操作,比如说直接在Activity里创建线程,然后直接在子线程中操作UI等,Android会直接异常退出,并提示...its views便是一个例子,字面意思是只有创建视图层次结构原始线程才能操作View,明显是线程安全相关。...s.说明在错误线程更新UI。 总结点: 不能在主线程(UI线程)进行耗时操作,比如连接网络,拷贝大数据,睡眠等操作。 比如连接谷歌网络。...在4.0之后谷歌强制要求连接网络不能在主线程进行访问 只有线程(UI线程)才可以更新UI 定时代码如下 MainActivity .java import android.os.Bundle; import...// 一旦计时器被终止,执行线程就会顺利地终止,并且不会再安排任务了。

    23810

    Kotlin入门(23)适配器进阶表达

    随着用户下拉或者上拉手势,已经被回收列表项要重新加载到界面上,倘若每次加载都得从头创建视图对象,势必增加了系统资源开销。...根据这种设计思路,提取出了循环视图基础适配器,Kotlin代码如下所示: //循环视图基础适配器 abstract class RecyclerBaseAdapter<VH : RecyclerView.ViewHolder...下面便是个循环视图网格适配器,实现了类似淘宝主页网格频道栏目,具体Kotlin代码如下所示: //把公共属性和公共方法剥离到基类RecyclerBaseAdapter, //此处仅需实现getItemCount...对于第一个布局编码,可以考虑将其作为一个整型输入参数;对于第二个数据结构,可以考虑定义一个模板类,在外部调用时再指定具体数据类;对于第三个bind方法,若是Java编码早已束手无策,现用Kotlin...尤其是最后两种实现方式,分别运用了Kotlin多项综合技术,才能Kotlin精妙语法之大成。 点此查看Kotlin入门教程完整目录

    1.8K41

    【Android从零单排系列三十四】《Android布局介绍——ConstraintLayout》

    它可以帮助开发者在用户界面上创建复杂布局,并提供了精确控制视图之间关系和位置能力。...这意味着你可以根据需要自由调整视图位置,并确保在不同屏幕尺寸或设备方向下正确布局。 性能优化:ConstraintLayout针对性能进行了优化,可以减少布局层次以及视图嵌套。...TextView 1被设置为位于父容器顶部,并与父容器左右边缘对齐。同时,底部边缘与TextView 2顶部边缘对齐。...TextView 2位于TextView 1底部,并与父容器左右边缘对齐。同时,底部边缘与Button顶部边缘对齐。 Button位于TextView 2底部,并与父容器左右边缘对齐。...同时,底部边缘与父容器底部边缘对齐。 通过这样约束条件,我们可以实现一种垂直排列布局,其中TextView 1位于顶部,TextView 2位于其下方,Button位于最底部。

    38720

    Android Studio 3.6中使用视图绑定替代 findViewById方法

    所以如果您在布局中放入了一个 TextView视图绑定就会暴露一个 TextView 类型属性给您。...在 ActivityAwesomeBinding.java 中,视图绑定生成了一个只有一个参数 inflate 方法,该方法通过将 parent 设定为空值来指定当前视图不会绑定到父视图中;视图绑定也暴露了一个有三个参数...bind 方法简化版本 bind 是绑定对象中最复杂一个方法,通过调用 findViewById 来绑定每个视图。...在使用引入布局时候,视图绑定会创建一个被引入布局绑定对象引用。注意 <include 标签有一个 id: android:id=”@+id/includes”。...这里逻辑跟使用普通视图一样, <include 标签也需要有一个 id 才能在绑定对象中生成对应属性。 include 标签必须有一个 id,才能生成对应属性。

    2.4K31

    使用视图绑定替代 findViewById

    所以如果您在布局中放入了一个 TextView视图绑定就会暴露一个 TextView 类型属性给您。...在 ActivityAwesomeBinding.java 中,视图绑定生成了一个只有一个参数 inflate 方法,该方法通过将 parent 设定为空值来指定当前视图不会绑定到父视图中;视图绑定也暴露了一个有三个参数...bind 方法简化版本 bind 是绑定对象中最复杂一个方法,通过调用 findViewById 来绑定每个视图。...在使用引入布局时候,视图绑定会创建一个被引入布局绑定对象引用。注意 include>标签有一个 id: android:id="@+id/includes"。...这里逻辑跟使用普通视图一样, include 标签也需要有一个 id 才能在绑定对象中生成对应属性。 include 标签必须有一个 id,才能生成对应属性。

    1.6K30

    在 View 上使用挂起函数

    其实协程不仅在处理跨线程问题有优势,还可以用来处理同一线程异步问题。 我认为有一个地方可以真正从中受益,那就是在 Android 视图系统中使用协程。...挂起函数 (Suspending functions) 是协程基础组成部分,允许我们以非阻塞方式编写代码。...这种特性非常适用于我们处理 Android UI,因为我们不想阻塞主线程,阻塞主线程会带来性能上问题,比如: jank。...等待 View 被布局完成 让我们看一个例子,封装了一个等待 View 传递下一次布局事件任务 (比如说,我们改变了一个 TextView内容,需要等待布局事件完成后才能获取该控件新尺寸):...对于刚接触代码的人来说, await 方法要比看似会断开回调更具可读性。 最后 希望通过本文,您可以进一步思考协程还可以在哪些其他 API 中发挥作用。

    2.3K30

    Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件

    viewgroup.png Android为我们提供了View和ViewGroup两个子类集合,提供常用一些输入控件(比如按钮,图片和文本域等)和各种各样布局模式(比如线程布局,相对布局,绝对布局...用户界面布局 在你APP软件上,用户界面上显示每一个组件都是使用层次结构View和ViewGroup对象来构成,比如,每个ViewGroup都是不可见容器,每个ViewGroup视图组用于组织子视图...View容器,而视图View可能是输入一些控件或者在某块区域小部件UI。...如果你有了层次结构树,你可以根据自己需要,设计出一些布局,但要尽量简单,因为越简单层次结构最适合性能。 要声明布局,可以在代码中实例化对象并构建,最简单方法也可以使用xml文件。 <?...,用来显示相对位置视图类,在默认情况下,所有子视图对会分布在左上角。

    1.8K20

    【Android】Android对于Activity运用以及ViewGroup和 用户界面组件在项目中运用

    PhoneWindow是Window子类。在这个PhoneWindow中,有一个DecorView内部类,它是所有应用程序窗口视图,直接控制是否显示活动(参考旧驱动程序原始单词…)。...然后,可以为这些对象定义一些其他行为,查询对象状态,或修改布局。有关创建UI布局完整指南,请参阅XML布局 用户界面组件 不需要使用所有View和ViewGroup对象创建UI布局。...android:text="I am a Button" /> APP用户界面上每个组件都由View和ViewGroup对象层次结构组成,如图1所示。...每个ViewGroup都是用于组织子视图不可见容器。其子视图可以是在UI上绘制区域输入控件或小部件。...ViewGroup:View类子类,可以有子控件,可以视为容器。Android UI中控件按照这种分层树结构堆叠。有两种方法可以创建UI布局。

    67820
    领券