Menü Header App Absturz bei Headeränderungen

wer112

Top Contributor
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:

Java:
 String email, kundennummer;
 Integer eingeloggt_bleiben;

Dummy, damit der String nicht leer ist:

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

onCreate:

Java:
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:

Java:
<?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!
 

wer112

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

Code:
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

Top Contributor
Du host die Instanz schon Falsch.

Hiermit wirst du nicht die Instanz bekommen. Aus dem Header.
Code:
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.
Code:
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");
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Was willst du hiermit wird auch Null sein?

Java:
nav_heder = (LinearLayout)findViewById(R.id.nav_header);


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

 
Zuletzt bearbeitet:

wer112

Top Contributor
Was willst du hiermit wird auch Null sein?

Java:
nav_heder = (LinearLayout)findViewById(R.id.nav_header);


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

Habe da ja genauso gemacht und nehme das gleiche:
Java:
        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

Top Contributor
Du host die Instanz schon Falsch.

Hiermit wirst du nicht die Instanz bekommen. Aus dem Header.
Code:
header_kundennummer = (TextView)findViewById(R.id.kundennummer_header);
Die ist mit sicherheit "Null".
Teste es im Debugger.
Verstehe ich net...
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.
Versuche es mal in etwa so.
Code:
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");

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

Jw456

Top Contributor
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.

XML:
<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

Top Contributor
das sollte gehn
Java:
LinearLayout hv = headerView.findViewById(R.id.nav_header);
hv.setBackgroundColor(Color.RED);

was ist "i_b7" "i_b2"...
nav_heder.setBackgroundColor(i_b7);
 
Zuletzt bearbeitet:

wer112

Top Contributor
das sollte gehn
Java:
LinearLayout hv = headerView.findViewById(R.id.nav_header);
hv.setBackgroundColor(Color.RED);

was ist "i_b7" "i_b2"...
nav_heder.setBackgroundColor(i_b7);
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

Top Contributor
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

Top Contributor
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. ...
 

wer112

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

Der Obrige Teil:

Java:
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:

Code:
 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:

Java:
  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

Top Contributor
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

Top Contributor
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?
 
Zuletzt bearbeitet:

wer112

Top Contributor
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....
Wie schaut das im php aus?
PHP:
<?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

Top Contributor
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);
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

Top Contributor
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?
 
Zuletzt bearbeitet:

wer112

Top Contributor
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..


WhatsApp Image 2022-05-02 at 12.43.36.jpeg

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

Top Contributor
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.
 

wer112

Top Contributor
Ic
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

Top Contributor
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?
 

wer112

Top Contributor
wo ist denn dein Dialog?
Ich hatte das so gemacht, aber wieder gelöscht. Hatte es so gemacht:


Java:
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

Top Contributor
Java:
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.


ich würde es mal so versuchen.
Code:
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.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
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
 
Zuletzt bearbeitet:

wer112

Top Contributor
Eine Frage wo bist du überhaupt in der Activity oder im Fragment.
In der Fragment Steuerung. Das ist eine normale Klasse, die Fragmente Steuern.
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.
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 ;)
 

wer112

Top Contributor
Java:
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.


ich würde es mal so versuchen.
Code:
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.
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

Top Contributor
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.
 
Zuletzt bearbeitet:

wer112

Top Contributor
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.
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.
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

Top Contributor
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

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

Jw456

Top Contributor
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

Top Contributor
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.
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.
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

Top Contributor
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?

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

Top Contributor
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

Top Contributor
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

Top Contributor
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

Top Contributor
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

Top Contributor
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?
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?

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 ;)

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

Top Contributor
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.


Java:
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.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
AGW Android Links im Menü und Namen ändern Android & Cross-Platform Mobile Apps 2
B Android Settings Menü Design Android & Cross-Platform Mobile Apps 2
B Android XML File ein lesen und menü erzeugen Android & Cross-Platform Mobile Apps 1
D Startbildschirm -> Automatisch ins Menü weiterleiten Android & Cross-Platform Mobile Apps 3
A Android Menü Button oben links Android & Cross-Platform Mobile Apps 1
G selbes Menü auf jeder Activity Android & Cross-Platform Mobile Apps 4
G Android zur Laufzeit den Text im Menü ändern Android & Cross-Platform Mobile Apps 3
N Wie Menü erstellen und Verknüpfen Android & Cross-Platform Mobile Apps 9
J Android PDF Header und Footer automatisch einfügen Android & Cross-Platform Mobile Apps 1
B Absturz der App bei leeren Edittext Android & Cross-Platform Mobile Apps 14
MaxG. Android Absturz bei Aufruf von onClickListener() Android & Cross-Platform Mobile Apps 8
M Android onClick führt zu Absturz Android & Cross-Platform Mobile Apps 8
B Android Bei Absturz Fehlerdatei erzeugen Android & Cross-Platform Mobile Apps 2
P CameraView - Absturz Android & Cross-Platform Mobile Apps 19
N Android Retain-Fragment + ActionBar-Tabs = Absturz!? Android & Cross-Platform Mobile Apps 9
T App Absturz bei Wechsel von WLAN zu mobilem Internet bzw. andersrum Android & Cross-Platform Mobile Apps 5
N Android bei Animation Absturz Android & Cross-Platform Mobile Apps 10

Ähnliche Java Themen


Oben