# Menü Header App Absturz bei Headeränderungen



## wer112 (29. Apr 2022)

So liebe Leute. 

Ich habe eine Klasse, wo die die ganze Fragmente steuert. 
Nachdem die App immer bei den Header Sachen abstürzt, habe ich mit in onCreate die Reihenfolge angesehen. Nachdem ich die Reihenfolge geändert habe.
habe ich mit findViewbyID die TextView & Backgrounds in die Steuerung reingeholt. Wenn ich den Text im Header ändern möchte:
z.B.: email.setText("max123"); oder die Farbe ändern möchte, sürzt die immer ab. In der Steuerung würd es ja normal reingeladen.
Da es für den Header keine eigene Klasse gibt, kann ich es nicht dort ändern. 
Ich lade die Nutzerdaten mit JSON vom Webserver runter und möchte die dort angezeigt bekommen. Sogar Festgelegte Dummis klappen nicht, auch nicht mit .tostring();
Es wäre schön, wenn ein Nutzer irgendwann im Header sein Profilbild verwenden kann(KP wiso man es in einem App Store sowas braucht. Aber der Play Store hat ja auch Symbole...).

Ich kann die Schriftfarbe im Menü/Toolbar ect. in der Steuerung ändern, aber nicht im Header. 

Variablen:

*Ursprung:*


```
String email, kundennummer;
 Integer eingeloggt_bleiben;
```

*Dummy, damit der String nicht leer ist:*


```
String email = "Email: ", kundennummer = "Kundennummer: ";
Integer eingeloggt_bleiben;
```

*onCreate:*


```
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


        header_kundennummer = (TextView)findViewById(R.id.kundennummer_header);
        header_email = findViewById(R.id.email_header);




        Import();


        FarbenImport();


        ColorStateList menueTextColor = ColorStateList.valueOf(i_b9);

        nav = (NavigationView)findViewById(R.id.navmenu);
        nav_heder = (LinearLayout)findViewById(R.id.nav_header);



        header_kundennummer.setText(kundennummer);
        header_email.setText(email);


        /*


        header_kundennummer.setTextColor(i_b2);
        header_email.setTextColor(i_b2);



         */



        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setBackgroundColor(i_b6);
        toolbar.setTitleTextColor(i_b8);
```

*Der Header XML:*


```
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#e0e0e0"
    android:id="@+id/nav_header"

    >

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:src="@mipmap/ic_launcher_round"

        />

    <TextView
        android:id="@+id/kundennummer_header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Kundennummer"
        android:textColor="#fff"
        android:textSize="15dp"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"/>

    <TextView
        android:id="@+id/email_header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="max@mustermann.de"
        android:textColor="#fff"
        android:textSize="15dp"
        android:layout_marginBottom="15dp"
        android:layout_marginLeft="10dp" />

</androidx.appcompat.widget.LinearLayoutCompat>
```

Zuerst muss der Header(Email, Benutzername,...) mit findViewById geladen werden.
Dann muss die Strings geholt werden, durch Import/Ressourcen(Strings), wenn die String oben Werte besitzen bzw. bekommen haben,
Dann kann man den Header das Setzen. Wenn ich versuche erst die Werte zu setzen, bevor es mit findView gefunden wird, dann ist es klar. Deswegen, habe ich die richtige Reihenfolge gemacht.

Ich hoffe, ihr wisst, wiso die App Abstürtzt, auch im try/catch bei Import. 
Auf andere Seiten, kann ich zugreifen und Texte/Farbe ect. ändern, nur nicht auf dem Header.

Ich hoffe ihr könnt mir helfen. 

Ich danke euch im Vorraus!


----------



## Jw456 (29. Apr 2022)

Mir welcher Fehlermeldung stürzt es denn ab?
Bitte genauer angeben.


----------



## wer112 (29. Apr 2022)

Jw456 hat gesagt.:


> Mir welcher Fehlermeldung stürzt es denn ab?
> Bitte genauer angeben.




```
2022-04-29 17:33:51.117 12120-12120/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2022-04-29 17:33:51.118 12120-12120/? E/Zygote: accessInfo : 1
2022-04-29 17:34:13.193 12120-12120/---- E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ------, PID: 12120
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.andrealfredklug.klugstore/com.----.fragment_steuerung}: java.lang.ClassCastException: androidx.appcompat.widget.LinearLayoutCompat cannot be cast to android.widget.LinearLayout
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3114)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7050)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
     Caused by: java.lang.ClassCastException: androidx.appcompat.widget.LinearLayoutCompat cannot be cast to android.widget.LinearLayout
        at com.------.fragment_steuerung.onCreate(fragment_steuerung.java:159)
        at android.app.Activity.performCreate(Activity.java:7327)
        at android.app.Activity.performCreate(Activity.java:7318)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3094)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7050) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
```


----------



## Jw456 (29. Apr 2022)

Du host die Instanz  schon Falsch.

Hiermit wirst du nicht die Instanz bekommen. Aus dem Header.

```
header_kundennummer = (TextView)findViewById(R.id.kundennummer_header);
```
Die ist mit sicherheit  "Null".
Teste es im Debugger.


Du brauchst erst das Platzhalter Objekt aus dem Layout wo dein NavMenü eingeblendet wird .
Mit dieser Instanz kannst du erst suchen.



Versuche es mal in etwa so.

```
NavigationView nav = (NavigationView) findViewById(R.id.navmenu);
View headerView = nav.getHeaderView(0);
TextView header_kundennummer = (TextView) headerView.findViewById(R.id.kundennummer_header);
header_kundennummer.setText("Your Text Here");
```


----------



## Jw456 (29. Apr 2022)

Was willst du hiermit wird auch Null sein?


```
nav_heder = (LinearLayout)findViewById(R.id.nav_header);
```


PS. warum nutzt  du noch das alte findViewById   und nicht View-Binding ?









						View Binding  |  Android Developers
					






					developer.android.com


----------



## wer112 (29. Apr 2022)

Jw456 hat gesagt.:


> Was willst du hiermit wird auch Null sein?
> 
> 
> ```
> ...


Habe da ja genauso gemacht und nehme das gleiche:

```
nav = (NavigationView)findViewById(R.id.navmenu);

        View headerView = nav.getHeaderView(0);

        header_kundennummer = (TextView)headerView.findViewById(R.id.kundennummer_header);
        header_email = (TextView)headerView.findViewById(R.id.email_header);

        Import();

        header_kundennummer.setTextColor(i_b2);
        header_email.setTextColor(i_b2);

        nav_heder = (LinearLayout)headerView.findViewById(R.id.nav_header);
        nav_heder.setBackgroundColor(i_b7);
```

Aber die App stürzt trotzdem App, obwohl mit dem headerView.

Benutzt man nicht mehr findViewById? 
View ist länger... Kann man das bei jede find benutzen dieses headerView?


----------



## wer112 (29. Apr 2022)

Jw456 hat gesagt.:


> Du host die Instanz  schon Falsch.
> 
> Hiermit wirst du nicht die Instanz bekommen. Aus dem Header.
> 
> ...


Verstehe ich net...


Jw456 hat gesagt.:


> Du brauchst erst das Platzhalter Objekt aus dem Layout wo dein NavMenü eingeblendet wird .
> Mit dieser Instanz kannst du erst suchen.


Warum brauche ich ein Platzhalter Objekt? Ich google mal, was das überhaupt ist.


Jw456 hat gesagt.:


> Versuche es mal in etwa so.
> 
> ```
> NavigationView nav = (NavigationView) findViewById(R.id.navmenu);
> ...



Das klappt, aber nur beim Header Text. Aber mit dem Hintergrund ect. geht es nicht, auch wenn ich headerView davor setze.


----------



## Jw456 (30. Apr 2022)

Zeige mal das Layout der Activity.


----------



## Jw456 (30. Apr 2022)

In deinen Activity Layout hast du ja sowas wie das hier.
Das ist sozusagen der Container Platzhalter für deine Navmenü.
In dem dann das Menü eingeblendet wird ähnlich wie bei den Fragments.


```
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
```

Und in deinem Menü hast du wieder ein unter Layout deinen Header. Und diese Instanz brauchst du, wenn du darin zu Laufzeit was ändern willst.
Nun ist es so das alles was in XML beschrieben wird beim Start der App in der onCreade mit dem Befehl setContentView geladen wird und da auch die View Objekte erstellt werden.
Willst du darauf zugreifen brauchst du die Instanz die du dir mit findviewByID geben lassen kannst.
Aber das was du willst ist nicht direkt in dem Layout der Activity sondern in dem Container.
Also holst du erst mal die Instanz von dem Container. Darin host du das Menü und darin den Header.



> Das klappt, aber nur beim Header Text. Aber mit dem Hintergrund ect. geht es nicht, auch wenn ich headerView davor setze.


Was meist du damit welchen Hintergrund willst du verändern?


----------



## Jw456 (30. Apr 2022)

das sollte gehn

```
LinearLayout hv = headerView.findViewById(R.id.nav_header);
hv.setBackgroundColor(Color.RED);
```

was ist "i_b7" "i_b2"...
nav_heder.setBackgroundColor(i_b7);


----------



## wer112 (30. Apr 2022)

Jw456 hat gesagt.:


> das sollte gehn
> 
> ```
> LinearLayout hv = headerView.findViewById(R.id.nav_header);
> ...


I_b7 ist ein Farcode, der im Int steht.


----------



## wer112 (1. Mai 2022)

Jw456 hat gesagt.:


> das sollte gehn
> 
> ```
> LinearLayout hv = headerView.findViewById(R.id.nav_header);
> ...


Nachdem Du mir das mit headerView gezeigt hast, und bei den TextViws funktioniert hat, habe ich es so ausprobiert(habe es oben definiert mit LinearLayout), aber die Ab ist ja Abgestürzt. Habe ja den gesamten Error Log doch geschickt. Ich habe das Gefühl,  das es unmöglich ist, weit über 6 Monate Dieses Problem xD , Aber der Text ist nach 6 Monate Gelöst 👍


----------



## Jw456 (1. Mai 2022)

wer112 hat gesagt.:


> Nachdem Du mir das mit headerView gezeigt hast, und bei den TextViws funktioniert hat, habe ich es so ausprobiert(habe es oben definiert mit LinearLayout), aber die Ab ist ja Abgestürzt. Habe ja den gesamten Error Log doch geschickt. Ich habe das Gefühl,  das es unmöglich ist, weit über 6 Monate Dieses Problem xD , Aber der Text ist nach 6 Monate Gelöst 👍


Was soll das mit den 6 Monaten?


----------



## wer112 (1. Mai 2022)

Jw456 hat gesagt.:


> Was soll das mit den 6 Monaten?


Solange sitze ich bereits an dieses Problem.

Ich habe das dank deiner Hilfe jetzt hinbekommen. 
Und da das mit dem Background net geklappt habe, habe ich den Log angesehen und habe den Fehler festgestellt.

In der Steuerung steht ja nav_heder = (LinearLayout)headerView.findViewById...
Aber in der XML Datei stand ausversehen: LinearLayoutCompakt. Kein Wunder das es mit dem Hintergrundfarbe nicht geklappt hat.

Ich danke dir erstmal.


Kurze Frage, zum anderen Thema: Wie bekomme ich in eine Methode in deren Try Stings nach oben?
Oben steht z.B. String abc;

Und im try steht dann abc= "123";
Wenn ich den String in den Log schreibe geht es. Wenn ich aber nachdem die Methode aufgerufen wurden ist, auf die Strings zugreifen möchte, sind die leer. Die Reihenfolge beachte ich ja. Es geht um die Json Strings. Ich musste die Texte im Try ändern. Aber dann habe ich kein Zugriff von wo anders oder später auf die Imports. Wenn z.B. Die Apps und Beschreibung und Bilder in JSon importiert wird, muss es ja in den Array String kommen, damit ich das in den ListViews ausgeben kann. aber wenn es da immer leer ist. ...


----------



## Jw456 (2. Mai 2022)

Zeige das mit dem String. So kann ich hier nicht viel dazu sagen.


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Zeige das mit dem String. So kann ich hier nicht viel dazu sagen.



*Der Obrige Teil:*


```
public class Klassennname extends AppCompatActivity {

    TextView header_kundennummer, header_email;

    String email, kundennummer;
    Integer eingeloggt_bleiben;
```

Dort oben muss die Ergebnisse von den JSON Import rein, damit ich über andere Methode ect. zu greifen kann.

*Der onCreate:*


```
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


        nav = (NavigationView)findViewById(R.id.navmenu);


        View headerView = nav.getHeaderView(0);


        header_kundennummer = (TextView)headerView.findViewById(R.id.kundennummer_header);
        header_email = (TextView)headerView.findViewById(R.id.email_header);


        Import();
```

Und zuerst rufe ich die Methode auf...

*Die Methode:*


```
private void NutzerDatenImport() {
        final String url = "https://-----.php";

        String sessionID = "";



        SharedPreferences pref = getSharedPreferences("---", MODE_PRIVATE);
        sessionID = pref.getString("----", sessionID);





        RequestQueue queue = Volley.newRequestQueue(Klassenname.this);

        String finalSessionID = sessionID;
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>(){


            @Override
            public void onResponse(JSONObject response) {

               if (response.equals("Ausgeloggt.")){

               }else if (response.equals("Session Fehler.")){

               }else{
                   try {

                       kundennummer = response.getString("KN");
                       email = response.getString("email");
                       eingeloggt_bleiben = response.getInt("eingeloggtBleiben");

                       Log.d("Import Json Werte: ", kundennummer + " " + email + " " + eingeloggt_bleiben);


                       header_kundennummer.setText(kundennummer);
                       header_email.setText(email);



                   } catch (JSONException e) {
                       Log.d("JSON  Fehler: ", e.toString());
                   }
               }


            }
        }, new Response.ErrorListener() {
```

Dort sage ich ja: kundennummer = response.getString("KN"); und später überprüfe ich die Strings und der Inhalt ist drinnen. 
Nach dem ich die Import() Methode aufgerufen habe und somit die Strings und Werte geladen habe, erst danach sage ich z.B.
mit Log/AlertDialog um zu prüfen, ob da Werte drinnen steht. Natürlich muss ich die Werte erst holen, bevor ich die ausgeben kann.
es sollte nach dem die Methode aufgerufen wurden ist, dass die Header Kundennummer Text und das andere den Text geändert wird. Da es nicht geklappt hatte, habe ich das im try gemacht. Aber ich kann später nicht einfach aus anderen Methoden ect. in dem try auf die Variablen zugreifen. Deswegen müssen die raus zum obrigen Teil....

Was mache ich falsch?

den in Methoden mache ich nur abc = "123"; und es kommt raus...(soweit wie ich noch weiß...)


----------



## Jw456 (2. Mai 2022)

Welches der beiden logs kommen in der logcat an? 
Wenn es das erste ist. Mit import json... Hast du da auch die richtigen Werte. 

Du schreibst du prüft den Inhalt  wo soll das sein, kein if zusehen wo du sowas machst.


----------



## Jw456 (2. Mai 2022)

Du speicherst doch die kn und Email in der Session oder cookie das kommt aber doch nicht im Response listener von volley an.

Wie schaut das im php aus?


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Du speicherst doch die kn und Email in der Session oder cookie das kommt aber doch nicht im Response listener von volley an.


Ja ich speichere das in den Sessions und lade die SessionID aus den ShaPref und hänge das an den Header. In PHP bekomme ich die Werte aus.
in der try Methode habe ich ja die Log.d, wo dadrinnen mit die Werte erfolgreich angezeigt wird.
Log.d("Import Json Werte: ", kundennummer + " " + email + " " + eingeloggt_bleiben); und die Strings sind dort richtig. Aber wenn ich nach der Methode die per Alert oder Log sehen möchte, sind die Strings immer leer, obwohl ich die in der try festgelegt habe. 

ps.: aktuell Stürzt deswegen, die App ab, da die nicht weiß, ob der Nutzer angemeldet sein möchte oder nicht....


Jw456 hat gesagt.:


> Wie schaut das im php aus?




```
<?php
session_start();

$kundennummer = trim($_SESSION['kn']);
$email = trim($_SESSION['emailadresse']);
$angemeldet = trim($_SESSION['angemeldet']);
$eingeloggt_bleiben = trim($_SESSION['eingeloggtbleiben']);

   //echo $kundennummer . " " . $email . " " . $angemeldet . " " . $eingeloggt_bleiben;     
      

if($angemeldet == 1){


    if(empty($kundennummer) OR empty($email) OR empty($eingeloggt_bleiben) OR empty($angemeldet)){
        
        if(empty($kundennummer)){
            echo "Session Fehler: Kundennummer";
        }
        
        if(empty($email)){
            echo "Session Fehler: Email";
        }
        
        if(empty($eingeloggt_bleiben)){
             echo "Session Fehler: Eingeloggt bleiben: " . $eingeloggt_bleiben;
        }
        
        if(empty($angemeldet)){
            echo "Session Fehler: Angemeldet";
        }
        

    }else{

        //Farben müssen geholt werden!

        $nutzerDaten = array();
        $nutzerDaten['KN'] = $kundennummer;
        $nutzerDaten['email'] = $email;
        $nutzerDaten['eingeloggtBleiben'] = $eingeloggt_bleiben;


        //echo "JSON";

        echo json_encode($nutzerDaten);





    }


}else{
    echo "Du bist ausgeloggt.";
    //echo "Kundennummer: " . $kundennummer . "<br>" . "Email: " . $email . "<br>" . "Eingeloggt bleiben: " . $eingeloggt_bleiben;
}

?>
```


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Welches der beiden logs kommen in der logcat an?
> Wenn es das erste ist. Mit import json... Hast du da auch die richtigen Werte.


Ja das mit: Log.d("Import Json Werte: ", kundennummer + " " + email + " " + eingeloggt_bleiben);


Jw456 hat gesagt.:


> Du schreibst du prüft den Inhalt  wo soll das sein, kein if zusehen wo du sowas machst.


Ich prüfe es mit den Logs bzw. Alert Dialog. Habe das nach dem Import hinzugefügt. 
Also:

Import();
Log.d("Dann die Überprüfung: ", kundennummer + " " + email + " " + eingeloggt_bleiben);
Alert Dialog.

Erstmal muss ich die Werte ja aus der JSON rauslesen und die oben in den Strings packen, erstdann kann ich mir die anzeigen lassen....


----------



## Jw456 (2. Mai 2022)

Wenn das alles so ist solltest du den Inhalt in den drei Instanzvariablen haben.
Nun wäre es interessant wie du damit weiter arbeitest.

Wird dir denn die Nummer Email in deinem Header angezeigt?


> Erstmal muss ich die Werte ja aus der JSON rauslesen und die oben in den Strings packen, erstdann kann ich mir die anzeigen lassen....



Ich dachte das klappt schon oder nicht?


----------



## Jw456 (2. Mai 2022)

Zeige doch mal den json Strings so wie ihn dir das php gibt. 
Das würde doch wohl ein Array sein.


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Zeige doch mal den json Strings so wie ihn dir das php gibt.
> Das würde doch wohl ein Array sein.


Ich bekomme ein JSON. Habe im try ein Alert Dialog gemacht, da der Toast zu schnell weg ist und Samsung überlegt es mit dem Samsungpass..




Das ist die Response, die mir im Roh angezeigt wird.
Das habe ich ja in den 3 Strings gesetzt und dann per Log angezeigt....


----------



## Jw456 (2. Mai 2022)

Ok wenn er so ist sollte es doch gehen. 
Und du solltest es in den Variablen haben. 

Wie und wo willst du denn anschließend zugreifen.


----------



## Jw456 (2. Mai 2022)

Eingeloggt bleiben ist ein String und kein intager. 
Als variable hast du einen int. 
Parse den string in einen int


----------



## wer112 (2. Mai 2022)

Ic


Jw456 hat gesagt.:


> Ok wenn er so ist sollte es doch gehen.
> Und du solltest es in den Variablen haben.
> 
> Wie und wo willst du denn anschließend zugreifen.


Ich rufe in den onCreate Methode zuerst die Methode auf, um Die Strings zu erhalten. 
Überschreibe ich die Strings. im Log sind die Strings erkennbar bzw. im ALert Doialog was du gesehen hast.
Nachdem die Methode ausgeführt wurden ist. möchte ich den header Email und Kundennummer Text setzen, aus den Strings.
Aber leider ist dort alle Strings und Werte Leer. Habe dort nach dem ich die Methode aufgerufen habe ein Alert Dialog hingemacht, aber der blieb  weiß. Nur im try kommt da die Inhalte...


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Eingeloggt bleiben ist ein String und kein intager.
> Als variable hast du einen int.
> Parse den string in einen int


eingeloggt bleiben ist eine Zahl. Ist die Zahl auf 1, dann will er nicht angemeldet bleiben und wenn die 2 ist, dann will man angemeldet bleiben.
Im Alert wurde ja alles richtig angezeigt. Da steht ja 2. Und auch in dem Log habe die Variablen gepasst, aber außer halb ist alles leer...

Eingeloggt sowie angemeldetBleiben sind Integer...

Oder was meinst du?


----------



## Jw456 (2. Mai 2022)

wo ist denn dein Dialog?


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> wo ist denn dein Dialog?


Ich hatte das so gemacht, aber wieder gelöscht. Hatte es so gemacht:



```
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_Klassenname);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


        nav = (NavigationView)findViewById(R.id.navmenu);


        View headerView = nav.getHeaderView(0);


        header_kundennummer = (TextView)headerView.findViewById(R.id.kundennummer_header);
        header_email = (TextView)headerView.findViewById(R.id.email_header);




        Import();



 AlertDialog.Builder builder = new AlertDialog.Builder(fragment_steuerung.this, R.style.AlertDialogTheme);
        View view = LayoutInflater.from(fragment_steuerung.this).inflate(R.layout.layout_erfolgreich_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
        builder.setView(view);
        ((TextView)view.findViewById(R.id.textTitle)).setText("JSON Werte");
        ((TextView)view.findViewById(R.id.textView_erfolgreich)).setText(kundennummer + "\n" +  email + "\n"  + eingeloggt_bleiben);
        ((Button)view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
        ((ImageView)view.findViewById(R.id.image_erfolgreich)).setImageResource(R.drawable.ic_erfolgreich);

        final AlertDialog alertDialog = builder.create();

        view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.dismiss();

            }
        });

        if (alertDialog.getWindow() != null){
            alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
        }



        alertDialog.show();
```

Die Überschrift kommt, aber der Alert Dialog war komplett weiß.


----------



## Jw456 (2. Mai 2022)

```
View view = LayoutInflater.from(fragment_steuerung.this).inflate(R.layout.layout_erfolgreich_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
```
Für mich falsch da hat ein findVewById schon mal nichts zusuchen.
Schaue mal hier.









						How to create a custom AlertDialog in Android - GeeksforGeeks
					

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.




					www.geeksforgeeks.org
				











						Dialogs  |  Android Developers
					






					developer.android.com
				




ich würde es mal so versuchen.

```
View view = getLayoutInflater.inflate(R.layout.layout_erfolgreich_dialog, null);
```

Auch das setzen der Button Listener ist falsch die musst du auf den Builder setzen  nicht auf die Custom View.

Schaue im Netz nach Custom AlertDialog.


----------



## Jw456 (2. Mai 2022)

Eine Frage wo bist du überhaupt in der Activity oder im Fragment.
Die Instanz variablen  (header_kundennummer, header_email )   sind ja in der Activity vom Fragment kannst du  nicht so einfach darauf zugreifen.

Was ist das für ein Context "fragment_steuerung.this" wenn du in der Activity bist reicht this  oder Klassennname.this


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Eine Frage wo bist du überhaupt in der Activity oder im Fragment.


In der Fragment Steuerung. Das ist eine normale Klasse, die  Fragmente Steuern.


Jw456 hat gesagt.:


> Die Instanz variablen  (header_kundennummer, header_email )   sind ja in der Activity vom Fragment kannst du  nicht so einfach darauf zugreifen.


Dank deine Hilfe geht es ja, mit dem headerView.findViewById....
Da ging das.


Jw456 hat gesagt.:


> Was ist das für ein Context "fragment_steuerung.this" wenn du in der Activity bist reicht this  oder Klassennname.this


Sorry, habe vergessen umzubenennen.
Ja, in dem Fall Klassennamen.this


----------



## Jw456 (2. Mai 2022)

wer112 hat gesagt.:


> In der Fragment Steuerung. Das ist eine normale Klasse, die  Fragmente Steuern.


Ist das die in der die Variablen sind?
wovon erbt  die?


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Ist das die in der die Variablen sind?
> wovon erbt  die?


In der normale Klasse, werden die Variablen reinkommen, da sind auch die ganzen Steuerung vom Menü ect. da stehen die Variablen. Es ist kein Fragment. Dank dir konnte ich das ändern....


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> ```
> View view = LayoutInflater.from(fragment_steuerung.this).inflate(R.layout.layout_erfolgreich_dialog, (ConstraintLayout)findViewById(R.id.layoutDialogContainer));
> ```
> Für mich falsch da hat ein findVewById schon mal nichts zusuchen.
> ...


Es funktioniert einwandfrei Und ich benutze Es überall  abgeändert.
Der Inhalt wird im try angezeigt, aber nicht außerhalb. Es liegt net am Dialog, da auch beim Log außerhalb leer ist...

Und ich habe es so gelernt und es ist ein Custom Alert Dialog

Das ist glaube ich mein Beispiel, was ich als Vorlage nahm:


----------



## Jw456 (2. Mai 2022)

jetzt noch mal ist der Dialog und die Variablen in der gleichen Klasse ja oder nein.



> Der Inhalt wird im try angezeigt, aber nicht außerhalb. Es liegt net am Dialog, da auch beim Log außerhalb leer ist...


Erkläre das genauer. Was ist bei dir ausserhalb?

hast du die drei Variablen noch mal irgendwo lokal in einer Methode  erstellt ? Ich hoffe nicht.

Denn den Code den du hier Postes wird  nicht dein Programm sein.


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> jetzt noch mal ist der Dialog und die Variablen in der gleichen Klasse ja oder nein.


Ja in der Klasse, die alle Fragmente steuert, werden die Daten Importiert und dort sind ja die Variablen und Dialog(zum Test) bzw. Auch Logs.
Die sind außerhalb des try leer in try, werden die richtig angezeigt werden.


Jw456 hat gesagt.:


> Erkläre das genauer. Was ist bei dir ausserhalb?


Also nicht in der Methode. In der nach der Klasse steht ja String email;
und das ist außerhalb der Methode.

Dann kommt onCreate, die den Import startet, Wo im try, in der Methode email = "peter"; kommt
danach kann ich per Log oder Dialog den String Email anzeigen Lassen.
Aber nach der Methode sind die Strings außerhalb(wo alle Variablen hinkommen) Leer, wenn ich den Inhalt anzeigen Lassen Möchte. Egal ob ich dafür ein Log oder Dialog verwende.

Wenn die Klasse startet, dann sind die Variablen eh leer, dann importieren ich Die und möchte die setzten(siehe try)
Und nachdem ich die gesetzt habe, möchte ich die anzeigen lassen bzw. Weiterverwenden.

Habe z.B. Ein onDestroy mit ne If Abfrage und mit der Eigeloggt Variable ,  aber da Die auch leer ist außerhalb stürzt es ab.

Im try kann ich ein Log.d("Email: ", email); und die Email Wird erfolgreich Angezeigt.

Aber wenn ich diesen Log Nachdem ich die Methode aufgerufen habe Verwenden möchte, ist Email plötzlich Leer.

Die Variablen Kommen nicht aus den Try bzw. Import Methode Raus.


Jw456 hat gesagt.:


> hast du die drei Variablen noch mal irgendwo lokal erstellt? In einer Methode


Nein, ich habe ja die nach der Klasse die Variablen benutzt, dort wo Alle hinkommen. Damit ich dann überall darauf zugreifen Kann. In der Methode benutze ich die so: email = ... und Nicht String email = response.getText("email");...


----------



## Jw456 (2. Mai 2022)

Das  wird wohl ein zeitliches Problem sein zu dem Zeitpunkt wo du den Dialog aufbaust wird wohl das Ergebnis noch nicht vom Server zurück sein.

Volley läuft ja Asyscon in einen Thread neben her. Parallel.
 also erst wenn du im Respos Listener bist solltest du  den Dialog machen.

vorher sind ja noch keine Daten da.


----------



## Jw456 (2. Mai 2022)

Zeitlich gesehen bist du aus deiner Import Methode wider raus und schon im Dialog. Und vielleicht jetzt kommt erst die Antwort vom Server.


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Zeitlich gesehen bist du aus deiner Import Methode wider raus und schon im Dialog. Und vielleicht jetzt kommt erst die Antwort vom Server.


Wird nicht die Methode erst komplett ausgeführt, bevor es aus der Methode raus geht?
Wenn ich dadrinnen den Text setze geht es sofort..


----------



## Jw456 (2. Mai 2022)

Der Listerner wird erst aufgrufen wenn die Antwort da ist. Da bist du schon lange aus der Methode raus.

Im listener solltest du deinen Dialog machen.

Listener Thema Callback Methode


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Das  wird wohl ein zeitliches Problem sein zu dem Zeitpunkt wo du den Dialog aufbaust wird wohl das Ergebnis noch nicht vom Server zurück sein.


Dacht Android arbeitet die Aufgaben nach und nach ab.


Jw456 hat gesagt.:


> Volley läuft ja Asyscon in einen Thread neben her. Parallel.
> also erst wenn du im Respos Listener bist solltest du  den Dialog machen.


Ja da bekomme ich die Antwort und der Dialog ist voll, siehe Pic.


Jw456 hat gesagt.:


> vorher sind ja noch keine Daten da.


Wie kann ich es machen, dass das mit Volley erst beendet wird, bevor es zum nächsten Teil übergeht?
Da ich dann ja auch Probleme habe mit den Apps anzeigen.

Wie kann ich das iumsetzen, dass erst die Methode vollständig ausgeführt wird und ich dann zugreifen kann?

Denn wenn die App geschlossen wird, wird ja Überprüft, welche Zahl es ist(onDestroy) und dann sich abmeldet...


----------



## wer112 (2. Mai 2022)

Jw456 hat gesagt.:


> Der Listerner wird erst aufgrufen wenn die Antwort da ist. Da bist du schon lange aus der Methode raus.


Und woher weiß ich, das die Antwort da ist und wie kann ich erst dann mit den weiteren Aktionen beginnen?



Jw456 hat gesagt.:


> Im listener solltest du deinen Dialog machen.


Der Dialog hat mit nur zum zeigen des inhalts gegeben... Also was drinnen ist.

Die Antwort vom Server war innerhalb 1 Sec. da....

Was soll ich tun, damit die App nicht App stürzt bzw. wie bekomme ich die App dazu, zu warten, bevor die App die Methode verlässt?


----------



## Jw456 (2. Mai 2022)

Gebe den Instanzvariablen doch einen defaut Wert. Damit die App nicht abbricht. Sie nicht null sind.


----------



## Jw456 (2. Mai 2022)

> Was soll ich tun, damit die App nicht App stürzt bzw. wie bekomme ich die App dazu, zu warten, bevor die App die Methode verlässt?



Das ganze ist Event gesteuert. Mit dem listener warte doch die App. Wenn du im  listener  bist geht es weiter mit der App.
Ist docch das selbe wie bei einem Button Listerner.


----------



## wer112 (5. Mai 2022)

Jw456 hat gesagt.:


> Das ganze ist Event gesteuert. Mit dem listener warte doch die App. Wenn du im  listener  bist geht es weiter mit der App.
> Ist docch das selbe wie bei einem Button Listerner.


Kann ich im Listerner eine While schleife machen?

Ich habe für alles drei Variablen ein Default Wert gegeben. Dadurch stürtzt die App nicht ab.
Nachdem Import, habe ich mir überlegt eine If abfrage zu machen mit While Schleife dadrinnen bzw. Nur die Whileschleife.

In der Whileschleife soll der Text von dem String ständig gesetzt werden. Die While Schleife geht solange wie eingeloggt_Bleiben == 0 ist bzw. < 1
Also die Schleife geht solange bis Volley die Grunddarten geladen hat. Die While ist eigentlich eine Schöne Sache...

Problem ist, wenn ich das mit einer While schleife mache, dass die App komplett Schwarz wird. Es gibt auch kein Fehlercode und die Stürzt nicht ab.
Wie kann ich den Text mit dem Default Wert in der While Schleife ändern, bis Volley den Wert 1 oder 2 ersetzt?
Ich beginne die Schleife, nachdem ich Import gestartet habe, sonst klappt das ja nie oder überschneidet das Asyncrone von Volley mit der Schleife und desswegen wird die App schwarz?


----------



## Jw456 (5. Mai 2022)

Mit einer While Schleife in der onCreate blockierst du den UI Thread nicht gut. Es werden keine User eingaben mehr angenommen  UI Thread anhalten ist nie gut. Wenn es zu lange dauert wird eine ANR kommen.

Du willst weiter machen wenn die Daten da sind das heilst wenn der Response-Listener aufgerufen wird.  
Wenn dein Server lange braucht blende einen Verlaufsbalken ein . 
Packe  den Code denn du dann ausführen willst in eine Methode und statte die in Listener. 
Nicht alles in den Listender packen wird ja sonst total unübersichtlich. 

Der Listener läuft im UI Thread auch den solltest du nicht solange anhalten das mit der While die wartet ist nie eine gute Idee.  

Was genau willst du nach den du den Server abgefragt machen?


----------



## Jw456 (5. Mai 2022)

Android ist ja ein Event gesteuertes System. 

Das dein Bildschirm schwarz bleibt wenn du in der onCreate eine wartende while-Schleife machst ist klar. 
Erst wenn du die Methode verlässt wird dein Layout aufgebaut. Und das System übernimmt wider die Kontrolle. 
Bei dem beenden der onCreate meine ich auch alle Methoden die daraus aufgrufen werden. 

Bei einen Button zb  erstellst und setzt den Listerner meistens in der onCreate oder in einer Methode die daraus aufgerufen wird. 
Danach giebst du die kontrolle wider an das System ab. Das System überwacht ob du auf den Button klickst. Wenn ja ruft es den listener vom button auf und du bist wider in der App. 

BBei volley ist das fast das gleiche nur das da kein User klickt sondern der Server antwortet im Listener..

Lister sind Methoden die das System. Selbständig aufruft wenn das entsprechende Ereignis stattgefunden hat.


----------



## wer112 (17. Mai 2022)

Jw456 hat gesagt.:


> Mit einer While Schleife in der onCreate blockierst du den UI Thread nicht gut. Es werden keine User eingaben mehr angenommen  UI Thread anhalten ist nie gut. Wenn es zu lange dauert wird eine ANR kommen.


Wie kann ich das machen, damit erst die Antwort gesetzt wird, bevor die App weiter macht? Sollte ich das in eine Methode packen und da die schleife bzw. im eigenen Treadt? Die ganze Methoden sind doch alle mit einander verbunden. Wie kann ich eine Methode außerhalb des onCreate aufrufen und mit allen verbundenen Methoden?


Jw456 hat gesagt.:


> Du willst weiter machen wenn die Daten da sind das heilst wenn der Response-Listener aufgerufen wird.
> Wenn dein Server lange braucht blende einen Verlaufsbalken ein .


Woher weiß ich, ob er lange braucht? Sollte ich ein Ladekreis machen und sagen, dass die Nutzerdaten lädt? und wenn es fertig ist, dann weg?



Jw456 hat gesagt.:


> Packe  den Code denn du dann ausführen willst in eine Methode und statte die in Listener.
> Nicht alles in den Listender packen wird ja sonst total unübersichtlich.


*Also rufe ich die Methoder z.B Header() aus dem Lisener auf und dann kann ich darauf zugreifen? Habe ich das so richtig verstanden?
Klingt eigentlich logisch *


Jw456 hat gesagt.:


> Der Listener läuft im UI Thread auch den solltest du nicht solange anhalten das mit der While die wartet ist nie eine gute Idee.
> 
> Was genau willst du nach den du den Server abgefragt machen?


Die Texte setzen(Kundennummer/Email) sowie für die Lifecircel die Abmelde Abfrage. Wenn der Nutzer die App zu schnell beendet, dann wird evtl. das falsche ausgeführt. Könnte ja, sowie du bereits gesagt hast mit ein Verlaufbalken(Ladekreis) machen... 
Auch Die Daten in der While schleife im Background Service(Den ich noch machen muss), läuft in einer While schleife und arbeitet, mehrere Informationen ab, z.B. Ob er Guthaben erhalten hat, Ob Geld Weniger oder mehr geworden ist(für Notification) oder ob jemand seine App gekauft hatt.. Das muss ja abgearbeitet werden, bevor der Background schläft und wieder von vorne anfängt...


----------



## Jw456 (17. Mai 2022)

> Wie kann ich das machen, damit erst die Antwort gesetzt wird, bevor die App weiter macht? Sollte ich das in eine Methode packen und da die schleife bzw. im eigenen Treadt? Die ganze Methoden sind doch alle mit einander verbunden. Wie kann ich eine Methode außerhalb des onCreate aufrufen und mit allen verbundenen Methoden?


Ich glaube du hast hier eine etwas komplett falsche Vorstellung.

In der OnCreate baust du nur dein layout auf und erstellt deine Views zb Button.
Die haben dann einen Listener oder auch Callback Methode.
Wo die ist ist ziemlich egal .
Ob du den listnener mit einer anonymen Klasse in der onCreate machst oder mit den Interface außerhalb  der onCrate ist egal.
Es wird beim Klick nur die Listerner Methode aufgerufen vom System. 
Du bist dann nicht mehr  in der onCreate.
Du musst das zeitlich sehen.



```
protected void onCreate(Bundle savedInstanceState) {
    ...
 
    // Anfordern des Button-Objekts über seine Ressourcen-ID
    Button button = (Button) findViewById(R.id.button_activity_main);
 
    // Registrieren der OnClickListener-Instanz für den Button
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // innerhalb dieser Methode kann auf den Klick reagiert werden
            ...
        }
    });
 
    ...
}
```

Hier zb hast du die onCreate schon lange verlassen  mit setOnClickListener… hast du dem System bekannt gemacht welche Methode es beim Klick aufrufen soll.  Und das ist die onClick Methode mehr nicht.  Aber wenn die aufgerufen wird bist du nicht mehr in der onCreate.

Natürlich kannst du aus dem Listener „onClick“  eine andere Methode die sich in der Klasse befindet aufrufen.

Tipp schaue was Anonyme Klassen sind.


----------

