使用android 4.1.1中的Kotlin更新任何类活动中视图值的最佳方法
我试图从一个外部类更新TextView中的值,但不起作用,我尝试了很多方法,但不幸的是我。。。顺便说一句,发送TextView就像类中的一个参数,并且可以正常工作,但是我们知道,如果我有很多视图,那么这不是最好的方式 因此,首先是一个基本代码: 在主活动XML中:使用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
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(){
}
}'