2017-07-03 19 views
-3

我是Android和Kotlin的新手,我遇到了一個我無法解決的問題。我有一個包含seekBarTextView的文件。當我更改seekBar時,我想實時顯示TextView中更改的值。 爲了學習新事物和練習Kotlin,我創建了一個包含Seekbar.OnSeekBarChangeListener的新類,並且該類對seekBar變化做出了反應。但問題是,當我將TextView設置爲新的seekBar值時,它會導致findViewByIdNullPointException在Kotlin的自定義類中訪問TextView

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()) 
} 
} 

類用於處理搜索欄變化:

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傳遞上下文,但這沒有幫助。

回答

0

兄弟我從最簡單的方式爲你做了。 我的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> 
+0

謝謝,但問題不在於如何解決這個問題最簡單的方法。我只是在練習並想知道如何從自定義類中訪問小部件,這就是爲什麼我要創建一個seekBar監聽類和導致產生'NullPointException'的類。我正在使用最新的Android Studio。 – Kristof

+0

好吧,我明白給我10分鐘。 –

0

它的工作我tried.I添加的TextView參考seekB的構造。

MainActivity

類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?) { 
} 
} 
+0

仍然無法正常工作。當我改變'SeekBar'值我得到一個錯誤:'java.lang.NullPointerException:試圖調用虛擬方法'android.content.res.Resources android.content.Context.getResources()'的空對象引用' – Kristof

+0

你能把你的代碼粘貼到這裏嗎? –

+0

完全一樣的你,這就是你粘貼上。 – Kristof

相關問題