在 android 4.1.1 中使用 Kotlin 从任何 class 更新 activity 中的视图值的最佳方法
Best way to update values for views in activity from any class with Kotlin in android 4.1.1
我正在尝试从外部 class 更新 TextView 中的值,但没有用,我尝试了很多方法和很多帖子,但不幸的是我...顺便说一句,将 TextView 作为参数发送在 class 中并且有效,但我们知道如果我有很多观点,那不是最好的方法。
所以首先用一个基本的代码:
主要ActivityXML:
<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 中有了我最后的证明
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
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"
}
}
试试看,
class ClaseDePrueba(ctx : Context)
{
val txtView : TextView = (ctx as MainActivity).findViewById(R.id.tvHello) as TextView
txtView.setText("Hello")
}
(无需再次inflate layout)
另一种方法是实现一个接口
您可以创建一个接口并尝试在您的 activity 中实现它。
interface MyInterface { fun update() }
然后尝试使用 class.
的引用访问函数
`Class MainActivity : AppCompatActivity() ,MyInterface{
override fun update(){
}
}'
使用 class 引用访问此函数并更新值。
如果您有一个 Activity
,它会扩充布局,它会在 XML 中创建对象并为它们分配 ID。 XML就像菜谱,Activity就像厨师,烤出美味的视图布局。
所以你的 Activity
有一些 TextView
对象。如果您有另一个 class,它会扩充同一个 XML 文件,它会创建 不同的对象 。它正在烘焙自己的布局,您对那些 View
对象所做的任何更改都不会在 Activity
中看到,因为它有一组完全不同的 TextView
实例(恰好共享 ID 值,因为那是 XML 食谱所说的)
所以如果你想弄乱 Activity
中的那些 TextView
,你有三个基本选择:
- 让
Activity
将它们传递给另一个 class,像列表一样的集合。 (“给你,这是你需要处理的东西”)
- 让它们在
Activity
中公开访问,这样你就可以将 Activity
实例传递给你的另一个 class,它可以直接戳它们,例如myActivity.coolTextView1.text = "wow!"
- 在
Activity
上创建某种界面,例如fun updateText(id: Int, text: String)
另一个 class 可以在需要更新某些内容时调用。 Activity
在内部处理细节,比如找到相关的 TextView
对象并更新它
无论哪种方式,如果您想更改 Activity
中显示的那些特定 TextView
实例,您需要以某种方式访问这些实例
我正在尝试从外部 class 更新 TextView 中的值,但没有用,我尝试了很多方法和很多帖子,但不幸的是我...顺便说一句,将 TextView 作为参数发送在 class 中并且有效,但我们知道如果我有很多观点,那不是最好的方法。
所以首先用一个基本的代码:
主要ActivityXML:
<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 中有了我最后的证明
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
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"
}
}
试试看,
class ClaseDePrueba(ctx : Context)
{
val txtView : TextView = (ctx as MainActivity).findViewById(R.id.tvHello) as TextView
txtView.setText("Hello")
}
(无需再次inflate layout) 另一种方法是实现一个接口
您可以创建一个接口并尝试在您的 activity 中实现它。
interface MyInterface { fun update() }
然后尝试使用 class.
`Class MainActivity : AppCompatActivity() ,MyInterface{
override fun update(){
}
}'
使用 class 引用访问此函数并更新值。
如果您有一个 Activity
,它会扩充布局,它会在 XML 中创建对象并为它们分配 ID。 XML就像菜谱,Activity就像厨师,烤出美味的视图布局。
所以你的 Activity
有一些 TextView
对象。如果您有另一个 class,它会扩充同一个 XML 文件,它会创建 不同的对象 。它正在烘焙自己的布局,您对那些 View
对象所做的任何更改都不会在 Activity
中看到,因为它有一组完全不同的 TextView
实例(恰好共享 ID 值,因为那是 XML 食谱所说的)
所以如果你想弄乱 Activity
中的那些 TextView
,你有三个基本选择:
- 让
Activity
将它们传递给另一个 class,像列表一样的集合。 (“给你,这是你需要处理的东西”) - 让它们在
Activity
中公开访问,这样你就可以将Activity
实例传递给你的另一个 class,它可以直接戳它们,例如myActivity.coolTextView1.text = "wow!"
- 在
Activity
上创建某种界面,例如fun updateText(id: Int, text: String)
另一个 class 可以在需要更新某些内容时调用。Activity
在内部处理细节,比如找到相关的TextView
对象并更新它
无论哪种方式,如果您想更改 Activity
中显示的那些特定 TextView
实例,您需要以某种方式访问这些实例