-1

Ich gebe Daten von einer Aktivität an Fragment weiter, im Fragment ist der zurückgegebene Wert null. Beachten Sie, dass ich 2 Toasts aus dem Fragment eingerichtet habe, um den Wert myValue zu testen. Der zurückgegebene Toast stammt aus der Else-Anweisung, in der myValue null ist.Übergabe von Daten von Aktivität zu Fragment Rückgabe Null

Aktivität:

  case R.id.forward: 

      Bundle bundle = new Bundle(); 
      bundle.putString("message", "From Activity"); 

      Fragment_02_Contacts mainFragment = new Fragment_02_Contacts(); 
      mainFragment.setArguments(bundle); 

      getSupportFragmentManager().beginTransaction().add(android.R.id.content, mainFragment).commit(); 

      break; 

Fragment:

String myValue; 
..... 

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

      if (myValue != null) 
       { 
        myValue = this.getArguments().getString("message"); 

        Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
        return inflater.inflate(R.layout.fragment_02_contacts, container, false); 
       } 
      else 
       { 
        Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
        // message is null ???? 
       } 

EDIT: Ich glaube, dass der Grund verknüpft sein können:

getSupportFragmentManager().beginTransaction().add(android.R.id.content, mainFragment).commit(); 

Macht dies meine Argumente zerstören und startet ein neues Fragment?

Antwort

1

zuerst den Wert ordnen und dann prüfen, ob es null wie folgt aus:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     myValue = this.getArguments().getString("message"); 
     if (myValue != null) 
      { 

Die Art und Weise Sie es getan haben, bevor überprüft Sie, wenn der Wert null ist, bevor sie tatsächlich jemals etwas zu es zuweisen (was bedeutet, dass es war immer Null), das ist, warum Sie immer in der else Anweisung gelandet sind und nie in der if, die das Zuweisen des Wertes hielt.

+0

Wenn ich es zuerst zuweisen, stürzt die App mit: java.lang.NullPointerException: Versuch, die virtuelle Methode 'java.lang.String android.os.Bundle.getString (java.lang.String)' auf einem Null-Objekt-Verweis aufzurufen , um den Absturz der App zu vermeiden, habe ich if/else verwendet, also stürzt meine App mit Ihrer Methode ab, weil ich eine Nullreferenz erhalte. – user3560827

+0

Das bedeutet, dass die Argumente nicht richtig gesetzt sind. Können Sie versuchen, sie in einem Konstruktor zu übergeben und sie dann dort zu setzen? Es wird auch empfohlen, Factory-Designmuster mit einer statischen 'newInstance' für Fragmente zu verwenden. – Vucko

1

Ok Ich habe es endlich verstanden, ich setze die Variable in eine try/catch-Klausel anstelle von if/else und die App stürzt nicht mehr ab, weil das Fragment zuerst als null beginnt und in einem Catch gefangen wird Wert aus Aktivität Die try-Klausel gibt Daten zurück.

  try{ 
      myValue = this.getArguments().getString("message"); 
      Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
     }catch(NullPointerException e){ 
      Toast.makeText(getActivity(), "message: "+myValue, Toast.LENGTH_SHORT).show(); 
      } 

Also die Idee von If/Else war fast richtig, es musste versuchen/fangen statt.