2016-10-11 5 views
1

Ich verwende ein Fragment, das verschiedene Informationen über ein Objekt anzeigt. Innerhalb onCreate des Fragments abrufen ich einige Werte aus dem Objekt und speichern sie in globalen Variablen:Der Wert der Variable ist anders als der zugewiesene

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
     String serializedShow = getArguments().getString(SHOW_TO_LOAD); 
     mShow = (new Gson()).fromJson(serializedShow, Show.class); 
     mScope = mShow.getScope(); 
     mLanguage = MainActivity.getSystemLanguage(); 
     mLanguage = mLanguage.replace("_", "-"); 
     mId = Integer.valueOf(mShow.getShowId()).toString(); //this line is important 
     Log.v(LOG_TAG, "DetailFragment onStart, Id is " + mId); 
    } 

Wie man sehen kann ich auf diese Variable eine bestimmte ID zuweisen. Ich benutze das Protokoll, um zu überprüfen, ob der Wert von mId der richtige ist und es ist. Bis jetzt läuft alles gut. Weiter im Code kann der Benutzer auf eine Schaltfläche klicken, um die URL im Browser zu öffnen. Die URLs sind unterschiedlich bei jedem Zeitpunkt dieses Fragment erstellt wird (jedes Mal, zeigt dieses Fragment andere Sachen)

private void fetchIMDBId(){ 
    Log.v(LOG_TAG, "starting IMDBAsyncTask with id " + mId); 
    new Async4().execute(mId); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_launch: 
      fetchIMDBId(); 
      return true; 
     default: 
      break; 
    } 
    return false; 
} 

Wie Sie die Methode fetchIMDBId sehen können() wird aufgerufen. Ich habe eine Protokollzeile, um zu prüfen, ob der Wert von mId, der zuvor in onCreate gesetzt wurde, derselbe ist. Es ist nicht das gleiche, es ist ein ganz anderer Wert. Spezifisch ist die ID des Objekts, das in einer früheren Instanz dieses Fragments angezeigt wurde.

Bitte sagen Sie mir, was ich falsch mache. Vielen Dank.

E: variable Erklärung

public class DetailFragment extends Fragment { 
private static final String LOG_TAG = DetailFragment.class.getSimpleName(); 
... 
private String mScope, mLanguage, mId; 
... 

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

E: vollständige Quelle here

+0

Ist MId Klassenvariable oder Instanzvariable genannt wird? –

+0

Was meinst du? Ich habe die Deklaration zum Hauptpost hinzugefügt – user11230

+0

Gibt es irgendwelche Setter auf mId? Sind Sie sicher, dass die zwei Protokolle, die Sie prüfen, für die gleiche Instanz Ihrer Klasse sind? –

Antwort

2

Ich glaube, dass Sie Ihre mId nicht korrekt der Async-Aufgabe zuweisen. Sie sollten die Mitte auf der Asynchron-Task-Methode anwenden, so dass die entsprechenden Mitte von jedem Fragment

private void fetchIMDBId(String mId){ 
    Log.v(LOG_TAG, "starting IMDBAsyncTask with id " + mId); 
    new Async4().execute(mId); 
} 

und dann rufen Sie die Methode innerhalb des Fragments

fetchIMDBId(this.mId); 
+0

Funktioniert immer noch nicht. Das onStart-Protokoll zeigt den korrekten Wert an, aber das Protokoll fetchIMDBId zeigt einen anderen Wert an. – user11230

+0

Haben Sie versucht, die Variable mId auf statisch zu setzen? – Ricardo

+0

IT WORKS Ich verdanke dir mein Leben Danke. – user11230

0

Versuchen this.mId verwenden und auch überprüfen, ob Ihr Fragment-Objekt gleiche wie vorherige.

Rufen Sie stattdessen this.fetchIMDBId() an.

+0

funktioniert nicht anwyay – user11230

Verwandte Themen