我试图从外部类更新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")
}
(无需再次膨胀布局(另一种方法可以是实现接口