NavigationView Text mit Variable ändern?

M

ManuelOG

Neues Mitglied
0
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 :)
 
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:
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
 
Erstelle mal ein Standart projekt mit navdrawer in AS. Und schaue mal wie es dort gemacht wird.
In kotlin natürlich.
 
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.
 
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:
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?
 
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.
Beiträge automatisch zusammengeführt:

Frage wo hast du den code eingefügt welche Methode.
Mit welcher sdk version arbeitest du?
 
Zuletzt bearbeitet:

Ähnliche Themen

A
  • AnimaAngelo85
Antworten
1
Aufrufe
332
swa00
swa00
B
Antworten
4
Aufrufe
470
bb321
B
FabianDev
Antworten
5
Aufrufe
548
swa00
swa00
Zurück
Oben Unten