在Kotlin的自定义类中访问TextView
我是Android和Kotlin的新手,我面临着一个我无法解决的问题。 我有一个activity_main.xml
文件,其中包含一个seekBar
和一个TextView
。 当我改变seekBar
我想在TextView
实时显示更改的值。 为了学习新事物和练习Kotlin,我创建了一个包含Seekbar.OnSeekBarChangeListener
的新类,该类对seekBar
变化作出反应。 但问题是,当我把TextView
设置为新的seekBar
值,这是一个findViewById
NullPointException
。
FATAL EXCEPTION: main Process: kotlindemo1.kristof.kotlin_1demo, PID: 24410 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference at android.app.Activity.findViewById(Activity.java:2090) at kotlindemo1.kristof.kotlin_1demo.seekB._$_findCachedViewById(seekB.kt:0) at kotlindemo1.kristof.kotlin_1demo.seekB.onProgressChanged(seekB.kt:15) at android.widget.SeekBar.onProgressRefresh(SeekBar.java:93)
这是MainActivity类:
package kotlindemo1.kristof.kotlin_1demo import android.app.Activity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* open class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) sB1.setOnSeekBarChangeListener(seekB()) } }
处理SeekBar更改的类:
package kotlindemo1.kristof.kotlin_1demo import android.app.Activity import android.os.Bundle import android.widget.SeekBar import kotlinx.android.synthetic.main.activity_main.* class seekB : SeekBar.OnSeekBarChangeListener, Activity(){ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if(fromUser) tW1.text = getString(R.string.max_gen_number, progress) //java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference } override fun onStartTrackingTouch(seekBar: SeekBar?) { } override fun onStopTrackingTouch(seekBar: SeekBar?) { } }
activity_main.xml中:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/cL" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="kotlindemo1.kristof.kotlin_1demo.MainActivity" > <SeekBar android:id="@+id/sB1" android:progress="100" android:max="200" android:layout_width="182dp" android:layout_height="21dp" android:layout_marginTop="60dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" tools:layout_constraintRight_creator="1" tools:layout_constraintLeft_creator="1" /> <TextView android:id="@+id/tW1" android:layout_width="139dp" android:layout_height="wrap_content" android:text="" android:textAlignment="center" android:layout_marginTop="20dp" app:layout_constraintTop_toBottomOf="@+id/sB1" app:layout_constraintRight_toRightOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintHorizontal_bias="0.502" tools:layout_constraintRight_creator="1" tools:layout_constraintLeft_creator="1" /> </android.support.constraint.ConstraintLayout>
在Java中很容易,使用FindViewById和SetContentView方法来引用一个小部件,但是在Kotlin中,如果我们导入kotlinx.android.synthetic.main.activity_main。*比我们不需要使用findViewById。 我尝试从MainActivity传递上下文,但这没有帮助。
它的工作我try.I添加到seekB的构造函数的TextView引用。
主要活动
class MainActivity:AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById<TextView>(R.id.tv) val seekBar = findViewById<SeekBar>(R.id.seekBar) seekBar.setOnSeekBarChangeListener(seekB(textView)) } }
seekB类
class seekB(val tv: TextView) : SeekBar.OnSeekBarChangeListener{ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { if(fromUser) tv.text = progress.toString() } override fun onStartTrackingTouch(seekBar: SeekBar?) { } override fun onStopTrackingTouch(seekBar: SeekBar?) { } }
我从最简单的方式为你做了。 我的Android Studio版本是3.0 Canary 5.如果你没有更新你的Android Studio,你可能会得到异常。
MainActivity.kt在onCreate
val textView = findViewById<TextView>(R.id.tv) val seekBar = findViewById<SeekBar>(R.id.seekBar) seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) { textView.text = p1.toString() } override fun onStartTrackingTouch(p0: SeekBar?) { } override fun onStopTrackingTouch(p0: SeekBar?) { } })
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.kt.seekbar.MainActivity"> <TextView android:id="@+id/tv" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <SeekBar android:id="@+id/seekBar" android:layout_centerInParent="true" android:max="100" android:layout_below="@id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
- Android Kotlin按钮+提醒对话框+列表
- 为Kotlin / Anko DSL定义的ImageView设置图像时遇到问题
- 错误:未找到注释处理器'__gen.AnnotationProcessorWrapper_debug_android_databinding_annotationprocessor_ProcessDataBinding'
- 在Kotlin Realm Extention中如何解决“功能不属于这个领域的模式的一部分”
- 无法在android studio中调用变量
- Kotlin的原始类型属性不允许使用lateinit修饰符
- Anko日志与详细和调试不起作用
- 如果有更新,我们是否需要下载完整的Android Studio?
- 在Kotlin中“即时”创建的类对象是否有构造函数?