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

使用android 4.1.1中的Kotlin更新任何类活动中视图值的最佳方法,android,android-studio,class,kotlin,android-activity,Android,Android Studio,Class,Kotlin,Android Activity,我试图从一个外部类更新TextView中的值,但不起作用,我尝试了很多方法,但不幸的是我。。。顺便说一句,发送TextView就像类中的一个参数,并且可以正常工作,但是我们知道,如果我有很多视图,那么这不是最好的方式 因此,首先是一个基本代码: 在主活动XML中: <TextView android:id="@+id/tvHello" android:layout_width="wrap_content"

我试图从一个外部类更新TextView中的值,但不起作用,我尝试了很多方法,但不幸的是我。。。顺便说一句,发送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 ClaseDePrueba(ctx : Context)
{
    val view = LayoutInflater.from(ctx).inflate(R.layout.activity_main,null,false)
    view.tvHello.text = "New Value"
}
甚至我也尝试使用Kotlin android扩展,比如这个网站,但不适合我

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

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)

    }

类MainActivity:AppCompatActivity(),ClaseDePrueba.MyInterfaceClass{
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textViews=ArrayList()
textViews.add(tvHello)
textViews.add(tvHello2)
ClaseDePrueba(this@MainActivity,文本视图)
}
class-ClaseDePrueba(ctx:Context,private-val-tviews:ArrayList?=null)
{
初始化{
如果(tView!=null){
tView[0]。text=“Init1”
tView[1]。text=“Init2”
}
}
试着去做

class ClaseDePrueba(ctx : Context)
{
    val txtView : TextView = (ctx as MainActivity).findViewById(R.id.tvHello) as TextView 
    txtView.setText("Hello")
}
(无需再次充气布局)
另一种方法是实现一个接口

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

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

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

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

因此,您的
活动
有一些
文本视图
对象。如果您有另一个类,它会膨胀同一个XML文件,它会创建不同的对象。它正在烘焙自己的布局,您对这些
视图
对象所做的任何更改都不会在
活动
中看到,因为它具有完全不同的属性租用一组
TextView
实例(它们碰巧共享ID值,因为XML配方就是这么说的)

因此,如果您想处理
活动
中的
文本视图
,您有三个基本选项:

  • 活动
    以列表的形式将它们传递给另一个类。(“给你,这是你需要处理的东西”)
  • 活动中公开访问它们
    ,这样您就可以将
    活动
    实例传递给您的其他类,并且它可以直接插入它们,例如
    myActivity.coolTextView1.text=“哇!”
  • 活动
    上创建某种类型的接口,例如
    有趣的updateText(id:Int,text:String)
    ,其他类在需要更新某些内容时可以调用该接口。
    活动
    在内部处理细节,例如查找相关的
    文本视图
    对象并对其进行更新

无论哪种方式,如果您想更改在
活动
中显示的那些特定的
文本视图
实例,您需要以某种方式访问这些实例

活动中的视图应该在活动中进行操作。没有理由将它们膨胀到活动类之外。为什么不能将
tvHello.text=“新值”
直接在活动中?此代码是一个示例,但我有一个复杂的代码,其中包含一个类和函数,如“override fun on Success”还有更多,然后我需要在活动中显示结果,然后创建一个接口,在活动中实现它,并从您想要的任何位置触发它。例如,从onSuccess,您的活动将侦听它。抱歉,我尝试了但没有工作抱歉,我尝试了但没有工作,第二行中有一个错误,显示“期待成员声明”我想这是因为Java KotlinI和Java KotlinI之间的语法不同。我将尝试使用接口,并让您知道对不起,但我不清楚如何使用接口更新类中的值以在TextView中反映该值。即如何“使用类引用访问此函数并更新值。”最后一行这是我的主要活动:
class MainActivity:AppCompatActivity(),ClaseDePrueba.MyInterfaceClass{override fun onCreate(savedInstanceState:Bundle?{super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)ClaseDePrueba(this@MainActivity)}重写fun updateClass(){TODO(“尚未实现”)}
和我的类
类ClaseDePrueba(ctx:Context){interface MyInterfaceClass{fun updateClass()}
但我不知道如何实现代码你能帮我吗?我希望这能帮助
类MainActivity:AppCompatActivity(),UpdateUi{lateinit var updateUi:updateUi重写fun onCreate(savedInstanceState:Bundle?{super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)updateUi=this var obj=A(updateUi)}重写fun updateUi(text:String){textView.text=text}接口updateUi{fun updateUi(text:String)}class A(private val updateuimp:updateUi){fun update(){updateuimp.updateUi(“HI”)}
class ClaseDePrueba(ctx: Context, private val tviews: ArrayList<TextView>? = null)
{
    init {
        if (tviews != null) {
            tviews[0].text = "Init1"
            tviews[1].text = "Init2"
        }
    }
class ClaseDePrueba(ctx : Context)
{
    val txtView : TextView = (ctx as MainActivity).findViewById(R.id.tvHello) as TextView 
    txtView.setText("Hello")
}
`Class MainActivity : AppCompatActivity() ,MyInterface{
  override fun update(){
  }
    }'