在android 4.1.1中使用Kotlin从任何类更新活动中视图值的最佳方式



我试图从外部类更新TextView中的值,但没有成功,我尝试了很多方法,发布了很多帖子,但我运气不好…BTW在类中像参数一样发送了TextView,并成功了,但我们知道,如果我有很多视图,这不是最好的方法。

因此,首先使用一个基本代码:

主活动XML:


<TextView
android:id="@+id/tvHello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

代码中:

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ClaseDePrueba(this@MainActivity)
}
}

终于在课堂上用我最后的证明

class ClaseDePrueba(ctx : Context)
{
val view = LayoutInflater.from(ctx).inflate(R.layout.activity_main,null,false)
view.tvHello.text = "New Value"
}

即使我尝试使用Kotlin android扩展,像这个网站,但不适用于我

https://antonioleiva.com/kotlin-android-extensions/

import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*

几个小时前,我试图实现一个接口,但我不知道如何引用TextView和机会值,我的代码:

class MainActivity : AppCompatActivity() , ClaseDePrueba.MyInterfaceClass {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ClaseDePrueba(this@MainActivity)
}
override fun updateClass() {
TODO("Not yet implemented")
}

我的班级

class ClaseDePrueba(ctx: Context)
{
interface MyInterfaceClass {
fun updateClass(
)
}

所以问题是……修复并正确工作的(最佳(方法是什么

更新和一个解决方案

我解决了创建了一个对象列表并作为参数

我不知道是否是最好的方式,但目前有效,感谢所有


class MainActivity : AppCompatActivity() , ClaseDePrueba.MyInterfaceClass {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textViews = ArrayList<TextView>()
textViews.add(tvHello)
textViews.add(tvHello2)
ClaseDePrueba(this@MainActivity, textViews)
}
class ClaseDePrueba(ctx: Context, private val tviews: ArrayList<TextView>? = null)
{
init {
if (tviews != null) {
tviews[0].text = "Init1"
tviews[1].text = "Init2"
}
}

您可以创建一个接口并尝试在活动中实现它。interface MyInterface { fun update() }然后尝试使用类的引用访问函数。

`Class MainActivity : AppCompatActivity() ,MyInterface{
override fun update(){
}
}'

使用类引用访问此函数并更新值。

如果您有一个Activity,它会膨胀布局,它会在XML中创建对象并为它们分配ID。XML就像一个食谱,"活动"就是厨师,烘焙出美味的视图布局。

所以你的Activity有一些TextView对象。如果您有另一个类,并且该类扩展了同一个XML文件,则会创建不同的对象。它正在烘焙自己的布局,对那些View对象所做的任何更改都不会在Activity中看到,因为它有一组完全不同的TextView实例(碰巧共享ID值,因为XML配方就是这么说的(

因此,如果你想处理Activity中的TextView,你有三个基本选项:

  • Activity将它们传递给列表之类的集合中的另一个类。("给你,这是你需要处理的东西"(
  • 使它们在Activity中公开可访问,这样您就可以将Activity实例传递给另一个类,它可以直接戳它们,例如myActivity.coolTextView1.text = "wow!"
  • Activity上创建某种接口,例如fun updateText(id: Int, text: String),当其他类需要更新某些内容时,可以调用它。Activity在内部处理细节,例如查找相关的TextView对象并更新它

无论哪种方式,如果您想更改Activity中显示的那些特定TextView实例,您都需要以某种方式访问这些实例

试试看,

class ClaseDePrueba(ctx : Context)
{
val txtView : TextView = (ctx as MainActivity).findViewById(R.id.tvHello) as TextView 
txtView.setText("Hello")
}

(无需再次膨胀布局(另一种方法可以是实现接口

最新更新