NavigationView Text mit Variable ändern?

M

ManuelOG

Neues Mitglied
Threadstarter
Ich grüße euch,

ich bin neu hier und habe auch erst angefangen mit Kotlin in Android Studio zu lernen. Ich kenne mich aber mit SPS Programierung aus.

Wie kann ich ein TextView, in der nav_header_main.xml also im Navigation Drawer, mit einer Variable ändern? Meine Lösungsversuche funktionieren nicht.

Code:
val navView : NavigationView = nav_view
        val header: View = navView.getHeaderView(0)
        val headeremail: TextView = header.nav_header_EMail
        headeremail.text = "test"
        Log.DEBUG
In "headeremail.text = "test"" soll mal eine Variable für E-Mails rein. Den String habe ich in der nav_header_main.xml entfernt und gegen "android:text="E-Mail""ersetzt.
Ich finde keine Lösung für mein Problem. Was mache ich falsch? Könnt ihr mir bitte helfen.

Schon mal vielen Dank :)
 
J

jogimuc

Stammgast
Hallo

Stimmt in Kotlin braucht man das findViewById nicht immer. In diesem Fall schon du hast keinen
Bezug zu deinen NavView.

val navView: NavigationView = findViewById(R.id.nav_view)
 
Zuletzt bearbeitet:
M

ManuelOG

Neues Mitglied
Threadstarter
Danke für deine Antwort.

dies hatte ich auch schon versucht. Quasi so:
Code:
import kotlinx.android.synthetic.main.nav_header_main.view.*

val navView : NavigationView = findViewById(R.id.nav_view)
        val header: View = navView.getHeaderView(0)
        val headeremail: TextView = header.nav_header_EMail
        headeremail.text = "test"
        Log.DEBUG
Wobei ich dann auch "import kotlinx.android.synthetic.main.nav_header_main.view.*" angeben musste.
Im Logcat unter Debug kommt dann die Fehlermeldung:
Code:
Caused by: java.lang.IllegalStateException: findViewById(R.id.nav_view) must not be null
Zu dieser Fehlermeldung kann ich im Internet nichts finden was mir hilft.

Frohe Weihnachten
 
J

jogimuc

Stammgast
Erstelle mal ein Standart projekt mit navdrawer in AS. Und schaue mal wie es dort gemacht wird.
In kotlin natürlich.
 
M

ManuelOG

Neues Mitglied
Threadstarter
Genau dies habe ich für mein Projekt genommen.

Wenn ich ein neues Projekt anlege steht in der
nav_header_main.xml:
Code:
<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="@string/nav_header_title"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/nav_header_subtitle" />
Die beiden Stings möchte ich gerne mit einer Variable in der MainActivity.kt ändern. Dazu habe ich erstmal android:text="@string/nav_header_subtitle" mit "android:text="E-Mail" ersetzt und den String in der strings.xml gelöscht.
Dennoch geht es nicht und ich bekomme die Fehlermeldung. Egal ob in meinem Projekt oder in einem neuen Projekt.
 
J

jogimuc

Stammgast
Hallo wenn ich dich richtig verstehe willst du zur Laufzeit das xml ändern.

Das geht nicht. Wenn du zur Laufzeit was ändern willst brauchst du erstens den Kontext der View und du musst die Java Methoden dafür benutzen.

Auf den Strings im xml kannst du zur Laufzeit nicht zugreifen.
Der xml Code wird vom Compiler in die entsprechenden Java Methoden übersetzt.
Auch solltest du im xml die String stehenlassen. Damit der xml auch vom Compiler richtig übersetzt werden kann.

Der xml Code dient dir als Programmierer zur Vereinfachung und zur Beschreibung deines Layouts. Dies wird vom Compiler übersetzt.

Und in deinen ersten Code hattest du meiner Meinung keinen richtigen Kontext oder besser gesagt nicht die richtige Instanz der View.
In Java muss du immer das findeviewbyid machen in kotlin geht das durch ein vorhandenes Plugin auch anders. Hier sicher nicht den auch der von AS erstellte Code benutzt es.

Mit dem find... suchst du genau die Instanz die dir der Compiler aus deinem xml erstellt hat.

Auch wenn du die Instanz richt haben solltest machst du das mit dem Textsetzen falsch.
Dafür ist setText( ) die richtige Methode. Und nicht einfach „=“


Code:
import kotlinx.android.synthetic.main.activity_main.*

val header: View = nav_view.getHeaderView(0)
val headeremail: TextView = header.findViewById(R.id.textView)
headeremail.setTex("test")
 
Zuletzt bearbeitet:
M

ManuelOG

Neues Mitglied
Threadstarter
Servus,
und danke 😊

Auf den Strings im xml kannst du zur Laufzeit nicht zugreifen.
Deswegen habe ich versucht diese Strings zu entfernen. Auch wenn dies wahrscheinlich nicht der beste Weg ist.

Code:
val header: View = nav_view.getHeaderView(0)
val headeremail: TextView = header.findViewById(R.id.textView)
headeremail.setTex("test")
Wenn ich den Code so verwende, wie ich es schon in vielen anderen Foren gelesen habe, bekomme ich diese Fehlermeldung:
Code:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View com.google.android.material.navigation.NavigationView.getHeaderView(int)' on a null object reference
Egal was ich heute versucht habe. Ich stoße immer wieder darauf. Nun habe ich versucht laut der Webseite (NavigationView | Android Developers) mich weiter in mein Vorhaben einzulesen und dies umzusetzen. Ich bin bis jetzt aber noch zu keiner Lösung gekommen.

Kann es sein dass ich irgendwo anders ein Fehler mache?
 
J

jogimuc

Stammgast
Mache es so wie ich es dir gegeben habe. Habe ich getestet. Ein Standart projekt und einfach die drei zeilen und den Import der ist bei dir falsch.
Am Layout xml nichts ändern.
Beitrag automatisch zusammengefügt:

Frage wo hast du den code eingefügt welche Methode.
Mit welcher sdk version arbeitest du?
 
Zuletzt bearbeitet:
Ähnliche Themen - NavigationView Text mit Variable ändern? Antworten Datum
7
Oben Unten