onViewCreated blockiert Session Zugriff gegensatz zu onCreateView? Fragment

wer112

Top Contributor
Ich habe ja ne Fragment Steuerung, wo ja verschidene Fragmente übers Menü aufgerufen werden kann.
Aktuell arbeite ich an der Entwickler Überprüfungsseite. Das bedeutet, dass der jenige geprüft wird, ob er bereits entwickler ist oder nicht. Sollte dieser bereits entwickler sein, wird geprüft, ob ein Zeit Bann hat oder ein dauer Bann(z.B. App für Kinderpornografie, App für kommikation für Terroristen, Drogen/Waffenhandel...). Sollte er dauerhaft gebannt sein, hat er kein Zugriff mehr zur Entwickler Console, aber er kann ja normal im Store Apps installieren bzw. Apps kaufen...

Jetzt ist es so, wenn ich die bestimmte Seite aufrufe, sind meine Session Variablen leer. Obwohl auf anderen Fragmente die Voll sind.
Der einzigste Unterschied, ist das ich jeden Jw456 Nicht mehr wie alle anderen Vor Fragmente alles in onCreatView packe, sondern in das onViewCreated reinmache.

Vielleicht hat onViewCreaded keinen Zugriff auf den speziellen Cookie Manger(
https://github.com/android-async-http/android-async-http -> implementation 'com.loopj.android:android-async-http:1.4.11'

Cookies speichern und abrufen mit dem Github Implementation
https://gist.github.com/manishk3008/2a2373c6c155a5df6326)

Hat das mit damit zutun, das ich jetzt alles wie von Jw456 vorgeschlagen hat, dass ich das so mache?:



Java:
public class ----- extends Fragment {

    Context context;

    TextView errorText, hinweißtext;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_----, container, false);

    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        context = view.getContext();
        errorText = (TextView)getActivity().findViewById(R.id.textView_error_ladeconsole);
        hinweißtext = (TextView)getActivity().findViewById(R.id.textView_ladeinfo);



        EntwicklerInfo();

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

Oder wie kann ich die Session Variablen wieder erhalten, sowie früher? :

Java:
public class Guthaben extends Fragment {


    String sessionID  = "";
    String guthaben = "0,00€";

    TextView guthabenText;

    private ProgressDialog progressDialog;






    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        View fragmentlayout_--- = inflater.inflate(R.layout.activity_----, null);



        guthabenText = (TextView)fragmentlayout_---.findViewById(R.id.---);




        GuthabenAbfrage();



        return fragmentlayout_---;
    }

Weil bei diesen Fragmente, habe ich das noch im alten Code so, ist nicht geändert, wie ich das jetzt mit der Prüfung gemacht habe, und da geht das problemlos.

Kann es daran liegen, dass ich das sogemacht habe, wie von Jw456 vorgeschlagen?

Ich hoffe, ihr könt mir helfen, um meine Session Variablen wieder zu bekommen ;)

Danke im Vorraus =)
 

Jw456

Top Contributor
Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); context = view.getContext(); errorText = (TextView)getActivity().findViewById(R.id.textView_error_ladeconsole
Nicht getActivity()
Sondern die Variable view zum suchen mit findViewById benutzen.

Denke nach und schaue in die Doku warum der Methode diese Variabe übergeben wird. Das ist doch nicht grundlos.
 

wer112

Top Contributor
Nicht getActivity()
Sondern die Variable view zum suchen mit findViewById benutzen.

Denke nach und schaue in die Doku warum der Methode diese Variabe übergeben wird. Das ist doch nicht grundlos.
Ja, habe es in den anderen Fragmente mit einem View und nem return.... Hast recht.

Aber die Session bleibt da trotzdem leer. In den anderen Fragemente, wo ich das ja anders habe, da bekomme ich die Variablen aus der Sessions.
 

Jw456

Top Contributor
Frage was verstehst du unter Session Variablen.
Wo sind die.?


Wenn du das meist.

String sessionID = "";
String guthaben = "0,00€";

Das sind Instanzvariablen.
 

wer112

Top Contributor
Frage was verstehst du unter Session Variablen.
Wo sind die wenn du das meist.
Hatte ja früher Problem gehabt, dass wenn man die App schließt, der Cookie Manager alles gelöscht hatte, wo der Nutzer ja ständig neu anmelden musste. Wenn man ein Cookie Manager hat, übergibt er ja die PHP SessID an den Server. Da ich ja den Code von der Oben makierte Seite verwende, klappt es problem los. Auf allen Fragmente, die auf den Server Daten runterladen bzw. hoch und die Sessions konnte ich immer bereits rausholen.

Der Cookie Manager den ich verwende, hat immer die gleiche ID.

Der ist so in /data/data... in den ShaPrefs gespeichert:

XML:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="com.orb.net.CookieStore.domain">https://---,https://---</string>
    <string name="com.orb.net.CookieStore.domain_https://---">PHPSESSID</string>
    <string name="com.orb.net.CookieStore.cookie_https://---PHPSESSID">zahlen und Buchstaben stehen hier, 382 chars. </string>
  </map>

Auf PHP wollte ich die anzeigen lassen, da die irgendwie im Ladebildschirm vom Entwickler Console leer sind. Obwohl auf die PHP Seite, für z.B. Guthaben Abfrage angezeigt wird. Hatte ich im Ladebildschirm Session Fehler... alles emty sei. Deswegen haben ich nur ein echo, wo Logcat als Response nixs anzeigt:

PHP:
<?php
session_start();

include_once("---/utf-8.php");
require "datenbank";


$kundennummer = trim($_SESSION['--']);
$email = trim($_SESSION['---']);
$angemeldet = trim($_SESSION['---']);
$eingeloggt_bleiben = trim($_SESSION['---']);


echo $email;




//-------------------------------------------------- Sicherheitsüberprüfung --------------------------------------------------




?>

Bei der Guthaben Abfrage:

PHP:
<?php
session_start();

include_once("----/utf-8.php");
require "datenbank";
require "----";

$kundennummer = trim($_SESSION['--']);
$angemeldet = trim($_SESSION['---']);


if($angemeldet == 1){

    Datenbank PDO abfrage

    echo $guhaben;



}else{


    echo "Du bist ausgeloggt.";
  
}

?>

Und da erhalte ich die Werte, also Kundennummer ect. , da ich das ja in der PDO Datenbank Abfrage ja aus der Session wissen muss.

Auf allen Seiten, werden gewissene Daten aus den Sessions geholt, da klappt ja alles nur im Ladebildschirm von der E Console sind die plötzlich leer. Der einzigste unterschied ist, das ich im Ladebildschirm, so angeordnet habe, sowie du es ja empfohlen hast. Die anderen Fragemte habe ich ja noch im alten Style, was du eigentlich nicht haben willst, aber da klappt ja alles.
 

Jw456

Top Contributor
Die anderen Fragemte habe ich ja noch im alten Style, was du eigentlich nicht haben willst, aber da klappt ja alles.
Ich habe dir bestimmt nichts befohlen.
Wenn dann nur gesagt das die alte Methode nicht mehr unterstützt wird.
Deprecated ist.
Wenn du in die Doku schaust und für die Zukunft Entwicklern wilst wirst du sehen das man das nicht mehr nutzen sollte.

Dafür gibt es jetzt die Methode onViewCreated.

Ich will das bestimmt nicht.


getActivity sollte eigentlich auch nicht mehr benutzt werden.
 

wer112

Top Contributor
Alles schön und gut was du schreibst. Nur wo genau ist jetzt das Problem.
Wie ich bereits mitteilte, sind die Session Variablen im PHP leer. z:B. bei der Guthaben Abfragen, sind Werte darin vorhanden, die ich nehmen kann.
Ich weiß nicht, ob es daran liegt, da ich das so gemacht habe, wie du es vorgeschlagen hast, dass ich so keine Werte bekomme.
Das wäre ja der einzigste Unterschied. Aber wenn du als Profi sagst, das du das so empfiehlst, würde ich es ungern wie bei den anderen Fragmene machen wollen.
Also der Response bei $email bleibt leer. Somit kann ich in der IF Abfrage nicht tiefer gehen.
Ich vermute, das der spezielle Cookie Manager keine SessID mit an den Header gibt, bei der Anordnung wie du es vorgeschlagen hast.
Und die Session wurde ja auch nicht gelöscht oder geleert, da ich sonst ja mein Guthaben(29999700.00€) nicht im App Store anzeigen lassen kann.
Darum kann ja die Session eigentlich nicht leer sein. Evtl. wird der header bei deiner Anordnung nicht mit gesendet und somit bleiben die Werte einfach leer.
 

wer112

Top Contributor
Wie hast du das geprüft?
Mit dem Logcat, sowie mit dem Toast. Bleibt Leer. Ich kann das ja nicht über den Browser testen, da die Seesion ja auf dem Handy ja gespeichert wird und wenn man sich im App Store angemeldet hat, kann ja nur die App die Session benutzen. Und die Email wird im Logcat bei der Steuerung angezeigt, was in der Session gespeichert ist, sowie Kundennummer und ob man eingeloggt bleibt oder nicht. Aber im Ladebildschirm vom Entwickler Console bleibt der Wert leer.
 

Jw456

Top Contributor
Toast ohne Inhalt oder kommt einfach nicht?


Tipp wenn du Daten unter Fragmenten austauschen willst. Solltest du dich mal mit den ViewModel und Oserver beschäftigen.
MVVM Pattern
 

Jw456

Top Contributor
Mit dem Logcat, sowie mit dem Toast. Bleibt Leer. Ich kann das ja nicht über den Browser testen, da die Seesion ja auf dem Handy ja gespeichert wird und wenn man sich im App Store angemeldet hat, kann ja nur die App die Session benutzen. Und die Email wird im Logcat bei der Steuerung angezeigt, was in der Session gespeichert ist, sowie Kundennummer und ob man eingeloggt bleibt oder nicht. Aber im Ladebildschirm vom Entwickler Console bleibt der Wert leer.
Da ich keinen Code habe und alte Threads nicht suchen will die dann garantiert auch nicht actuell sind. Kann ich hier nichts sagen.
 

wer112

Top Contributor
Toast ohne Inhalt oder kommt einfach nicht?


Tipp wenn du Daten unter Fragmenten austauschen willst. Solltest du dich mal mit den ViewModel und Oserver beschäftigen.
MVVM Pattern
Java:
  @Override
            public void onResponse(String response) {

                Log.e("Response Entwickler: ", response);
                Toast.makeText(context, "Response: " + response, Toast.LENGTH_SHORT).show();

Da kommt nur das was dortsteht, ohne Response Text. Der Toast zeigt an: Response:

hatte ja vor Background Service zu machen, um die Daten da in die jeweilige Fragmente zu bekommen, wo ja Ladezeit reduziert wird.
Aber ich habe paar Daten ja in Sessions gespeichert, da ich die nicht immer mit übergeben möchte und auch prüfen muss, ob der jenige noch angemeldet ist oder nicht.

Da der Cookie Manager ja den Header eigentlich mitsendet, solange die App offen ist, verstehe ich nicht, wiso über all es problemlos klappt und da nicht. Vermutung, durch dein Vorschlag, aber sollte doch nicht so sein...
 

wer112

Top Contributor
Da ich keinen Code habe und alte Threads nicht suchen will die dann garantiert auch nicht actuell sind. Kann ich hier nichts sagen.

Hier Guthaben Abfrage:
Java version:
Java:
package ----;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;

public class --- extends Fragment {


    String sessionID  = "";
    String guthaben = "0,00€";

    TextView guthabenText;

    private ProgressDialog progressDialog;






    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        View fragmentlayout_guthaben = inflater.inflate(R.layout.activity_guthaben, null);



        guthabenText = (TextView)fragmentlayout_guthaben.findViewById(R.id.---);




        G---();



        return fragmentlayout_guthaben;
    }

    private void G---() {

        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("Bitte warten...");
        progressDialog.setTitle("Aktuallisiere Guthaben");
        progressDialog.setIndeterminate(true);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setCancelable(false);
        progressDialog.show();

        String url = "https://----.php";

        RequestQueue queue = Volley.newRequestQueue(getActivity());

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                guthaben = response.toString();
                guthabenText.setText(guthaben + "€");

                progressDialog.dismiss();

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme);
                View view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_error_dialog, getView().findViewById(R.id.layoutDialogContainer));


                builder.setView(view);
                ((TextView) view.findViewById(R.id.textTitle)).setText("VolleyError");
                ((TextView) view.findViewById(R.id.textView_error)).setText("ERROR: " + error.toString());
                ((Button) view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                ((ImageView) view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

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

            }
        });
        queue.add(stringRequest);
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
}

und der dazugehörige PHP Code:

PHP:
<?php
session_start();

include_once("---/utf-8.php");
require "Datenbank";
require "Security Abfrage";

$kundennummer = trim($_SESSION['--']);
$angemeldet = trim($_SESSION['---']);


if($angemeldet == 1){

    Datenbank PDO Abfrage

    echo $guhaben;



}else{


    echo "Du bist ausgeloggt.";
  
}

?>


und der Ladebildschirm Entwickler Console Java:

Java:
package --------;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.CookieStore;

public class ---- extends Fragment {

    Context context;

    TextView errorText, hinweißtext;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_---, container, false);

    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        context = view.getContext();
        errorText = (TextView)view.findViewById(R.id.textView_error_ladeconsole);
        hinweißtext = (TextView)view.findViewById(R.id.textView_ladeinfo);



        ----();

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    private void ----(){

         String url = "https:/---";

        RequestQueue queue = Volley.newRequestQueue(context);

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                Log.e("Response Entwickler: ", response);
                Toast.makeText(context, "Response: " + response, Toast.LENGTH_SHORT).show();

                if (response.equals("Session Fehler.")){
                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme);
                    View view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_error_dialog, (ConstraintLayout)getActivity().findViewById(R.id.layoutDialogContainer));
                    builder.setView(view);
                    ((TextView) view.findViewById(R.id.textTitle)).setText("Fehler");
                    ((TextView) view.findViewById(R.id.textView_error)).setText(response);
                    ((Button) view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                    ((ImageView) view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

                    final AlertDialog alertDialog = builder.create();

                    view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            alertDialog.dismiss();
                            startActivity(new Intent(getActivity(), fragment_steuerung.class));
                        }
                    });

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


                    alertDialog.show();

                }else if(response.equals("Du bist ausgeloggt.")){
                    SharedPreferences sharedPreferences = getActivity().getSharedPreferences("User", Context.MODE_PRIVATE);

                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString(getResources().getString(R.string.prefLoginState), "loggendout");
                    editor.commit();

                    Log.e("Abmelden" , "Session wurde von SharedPreferences geladen.");
                    startActivity(new Intent(getActivity(), login.class));

                }else if(response.equals("Entwickler Fehler.")){
                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme);
                    View view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_error_dialog, (ConstraintLayout)getActivity().findViewById(R.id.layoutDialogContainer));
                    builder.setView(view);
                    ((TextView) view.findViewById(R.id.textTitle)).setText("Fehler");
                    ((TextView) view.findViewById(R.id.textView_error)).setText("Laden der Informationen ist Fehlgeschlagen.\nProbieren Sie es später erneut.\nOder kontakieren Sie den Support.");
                    ((Button) view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                    ((ImageView) view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

                    final AlertDialog alertDialog = builder.create();

                    view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            alertDialog.dismiss();
                            startActivity(new Intent(getActivity(), ---.class));
                        }
                    });

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


                    alertDialog.show();

                }else if(response.equals("Bann for ever.")){
                    errorText.setText("Dein Entwicklerkonto ist für immer gesperrt!");
                    hinweißtext.setText("Gerne können Sie sich mit uns in Verbindung setzen,\nSollte ein Fehler unserseits vorliegen,\n wären wir bereit dies entsprechend zu entsperren.");

                }else if(response.equals("Bereits Entwickler.")){
                    startActivity(new Intent(getActivity(), Entwickler_Konsole.class));

                }else if(response.equals("Kein Entwickler.")){
                    ---();

                }else{
                    errorText.setText("Account gesperrt!");
                    hinweißtext.setText("Dein Account ist bis zum " + response  +" gesperrt.\nDer Grund wurde Ihnen per Mail mitgeteilt.\nSollten Sie noch welche Fragen haben,\nwenden Sie sich an den Support.");
                }

            }
        }, new Response.ErrorListener() {
            @Override
                public void onErrorResponse(VolleyError error) {
                Toast.makeText(context, "VolleyError: " + error.toString(), Toast.LENGTH_SHORT).show();
                }
        });


        queue.add(stringRequest);


    }


    private void ----(){

        Toast.makeText(getActivity(), "Du bist kein Entwickler!", Toast.LENGTH_SHORT).show();
        Log.e("Entwickler:", " Du bist kein Entwickler!");
    }

}
 

wer112

Top Contributor
Das Thema hat jetzt aber nichts mit der onViewCreated zu tun.
Wenn der respons keime Daten liefert.
Weil als ich das alles in den anderen Fragmente das in onCreateView gepackt hatt, ging das alles, deswegen weiß ich ja nicht, ob das an deinem Aufbau liegt, dass der Cookie Manager das nicht übergibt oder nicht. Ich kann das mal ausprobieren, ob es daran liegt.
Aber die Session sind ja eigentlich gefüllt, da ich sonst ja keine Werte erhalte, was ich eben bekomme, da ich sonst keine Datenbank zugriffe habe.
und die PHP Seiten sind eigentlich fast gleich aufgebaut. Und habe ja auch die Zeilen überprüft, ob über session_start() ne Leerzeile dazwischen ist...
 

Jw456

Top Contributor
„onActivityCreated“ ist Deprecated sollte nicht mehr benutzt werden.

https://stackoverflow.com/questions...recated-how-to-properly-use-lifecycleobserver

in der „onCreateView“ solltte nur das Layout geladen und zurückgegen Werden viel mehr nicht.

Das layout ist erst am Ende der Methode geladen. Ausgaben auf den Bildschirm werden oft nicht richtig angezeigt wenn sie hier schon gemacht werden.
Dazu ist die „onViewCreated“ gedacht.
Wenn du beides benutzt (onViewCreated und onActivityCreated) wie in dem Letzen Code Beispiel kein Wunder das da einiges schief läuft.

Wie ich schon sagte onAvtivitCreatd ist out nicht mehr benutzen. Seit API 28.
 

Jw456

Top Contributor
Java:
 private void ----(){ // übergib hier das view

         String url = "https:/---";
....
      
      ((TextView) view.findViewById(R.id.textTitle)).setText("Fehler"); // benutze hier das übergebene view.
 

Jw456

Top Contributor
Java:
public class --- extends Fragment {


    String sessionID  = "";
    String guthaben = "0,00€";

    TextView guthabenText;

    private ProgressDialog progressDialog;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        View fragmentlayout_guthaben = inflater.inflate(R.layout.activity_guthaben, null);

        guthabenText = (TextView)fragmentlayout_guthaben.findViewById(R.id.---);
        // die Ids klannst du dier hier holen aber die methode G solltest du erst in der
        //onActivityCreated aufrufen wenn du unter API 28 arbeitest sonst onViewCreated()

        G---(); // falsch hier nicht.

        return fragmentlayout_guthaben;
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
     
        // wenn dann hier das "G---" statren
    }
}



Schaue dir die Doku an ab API 28 ist einiges Deprecated.
Ja getActivity gibt es noch aber arbeitet bzw. gibt etwas anderes zurück als vorher.



public final Activity getActivity () // bis API 28

public final @Nullable FragmentActivity getActivity() // ab API 28
 
Zuletzt bearbeitet:

wer112

Top Contributor
Java:
 private void ----(){ // übergib hier das view

         String url = "https:/---";
....
     
      ((TextView) view.findViewById(R.id.textTitle)).setText("Fehler"); // benutze hier das übergebene view.
Ich habe das View übergeben, habe das wieder umgestellt, wie du es damals vorgeschlagen hast, aber view wird bei Alert rot Makiert...

Java:
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_ladeseiteconsole, container, false);

    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        context = view.getContext();
        errorText = (TextView)view.findViewById(R.id.textView_error_ladeconsole);
        hinweißtext = (TextView)view.findViewById(R.id.textView_ladeinfo);

        ----(view);
        
    }

    /*
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
    
     */

    private void ----(View view){

         String url = "----";

        RequestQueue queue = Volley.newRequestQueue(context);

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                Log.e("Response Entwickler: ", response);
                Toast.makeText(context, "Response: " + response, Toast.LENGTH_SHORT).show();

                if (response.equals("Session Fehler.")){
                    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme);
                     view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_error_dialog, (ConstraintLayout)getActivity().findViewById(R.id.layoutDialogContainer));
                    builder.setView(view);
                    ((TextView) view.findViewById(R.id.textTitle)).setText("Fehler");
                    ((TextView) view.findViewById(R.id.textView_error)).setText(response);
                    ((Button) view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
                    ((ImageView) view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);

                    final AlertDialog alertDialog = builder.create();

                    view.findViewById(R.id.buttonAction).setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            alertDialog.dismiss();
                            startActivity(new Intent(getActivity(), fragment_steuerung.class));
                        }
                    });

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


                    alertDialog.show();

Laut mein Projekt Gradle ist das
minSdkVersion 21
targetSdkVersion 30

also ja unter 28.
 

Jw456

Top Contributor
Java:
    private void ----(final View view){ // muss aber nicht final sein



...
if (response.equals("Session Fehler.")) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme);
    //view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_error_dialog, (ConstraintLayout) getActivity().findViewById(R.id.layoutDialogContainer));
   
    builder.setView(view);
    ((TextView) view.findViewById(R.id.textTitle)).setText("Fehler");
    ((TextView) view.findViewById(R.id.textView_error)).setText(response);
    ((Button) view.findViewById(R.id.buttonAction)).setText(getString(R.string.okay));
    ((ImageView) view.findViewById(R.id.image_error)).setImageResource(R.drawable.ic_error);
 
Zuletzt bearbeitet:

wer112

Top Contributor
Java:
    private void ----(final View view){

...
if (response.equals("Session Fehler.")) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme);
    //view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_error_dialog, (ConstraintLayout) getActivity().findViewById(R.id.layoutDialogContainer));
   
[/QUOTE]
Diese view = LayoutInflater kann ich ja nicht rausnehemen, woher soll Der AlertDialog wissen, wo das Layout sich befindet?
 

Jw456

Top Contributor
Java:
private void ggg(View view) {

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getContext());
        alertDialogBuilder.setTitle("Hallo .. !!!");
        alertDialogBuilder.setMessage("Are you sure,You want to exit");
        alertDialogBuilder.setCancelable(false);
        alertDialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                Toast.makeText(view.getContext(),"You clicked over Yes",Toast.LENGTH_SHORT).show();
            }
        });

        alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(view.getContext(),"You clicked over No",Toast.LENGTH_SHORT).show();
            }
        });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
 

Ähnliche Java Themen

Neue Themen


Oben