2016-04-03 16 views
-1

Ich versuche, den Zustand einer Variablen mit der onSaveInstanceState() eines Fragments zu speichern. Die Variable, die ich speichern möchte, wird in einer anderen Klasse in meinem Programm erstellt, aber sie wird immer als 0 (Anfangswert) gelesen. Ich weiß, dass ich den Variablenwert erhöhe. Wie kann ich den tatsächlichen Wert der Variablen erhalten? Dies ist mein Code:Fragment erhalten Variablenwert von einer anderen Klasse

public class ObjectivesActivity extends Fragment { 
//Variables 
ObjectivesLogic objectivesLogic = new ObjectivesLogic(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // retain this fragment 
    System.out.println("savedInstanceState: " + savedInstanceState); 
    if (savedInstanceState != null) { 
     // Restore last state for checked position. 
    } 
} 

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

@Override 
public void onStart() { 
    super.onStart(); 
    if (objectivesLogic.getCount()>0){ 
     objectivesLogic.restoreFragment(); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    int save = objectivesLogic.getCount(); 
    System.out.println("save: "+save); 
    outState.putInt("Count",save); 
} 


} 

und das ist, wo ich die Variable bin erstellen:

public class ObjectivesLogic extends AppCompatActivity { 
//Variables 
int count = 0; 
View savedLinearLayoutView = null; 
Context savedContext = null; 
public void addObjective(Context context, View linearLayoutView) { 
    savedContext = context; 
    savedLinearLayoutView = linearLayoutView; 
    if (count < 8) { 
     EditText editText = new EditText(context); 
     LinearLayout linearLayoutObjectives = (LinearLayout) linearLayoutView; 
     editText.setId(R.id.edit_text_); 
     linearLayoutObjectives.addView(editText); 
     count++; 
    } 
} 
public void restoreFragment(){ 
    for(int i=0; i<count;i++){ 
     EditText editText = new EditText(savedContext); 
     LinearLayout linearLayoutObjectives = (LinearLayout) savedLinearLayoutView; 
     editText.setId(R.id.edit_text_); 
     linearLayoutObjectives.addView(editText); 
     count++; 
    } 
} 
public int getCount() { 
    return count; 
} 
} 

getCount() bekommt immer 0. Vielen Dank für Ihre Hilfe :)

+0

Ich empfehle Ihnen, eine Parcelable-Version Ihres "Logik" -Objekts zu erstellen, damit Sie es speichern und auf dem Staatspaket wiederherstellen können. Ihr "Logik" -Objekt sollte überhaupt nicht von einer Aktivitätsklasse erben, wenn es sich nicht wirklich um eine Aktivität handelt, Sie brennen einfach Speicher ohne wirklichen Grund auf diese Weise. Legen Sie keine IDs für programmgesteuerte Ansichten fest, da dies nur zur Überbrückung der XML-Code-Lücke verwendet wird. Versuchen Sie nicht, an einer Context-Instanz festzuhalten, da dies zu einem sehr schwerwiegenden Speicherverlust führen kann. – Machinarius

+0

Danke Machinarius! –

+0

Immer glücklich zu helfen – Machinarius

Antwort

0

Sie ‚re Aufruf super.onSaveInstanceState(outState); vor outState.putInt("Count",save);

@Override 
public void onSaveInstanceState(Bundle outState) { 
    int save = objectivesLogic.getCount(); 
    System.out.println("save: "+save); 
    outState.putInt("Count",save); 

    super.onSaveInstanceState(outState); 

} 
+0

Dies ist nicht wirklich der Grund. Sie können '' super.onSaveInstanceState (outState); '' jederzeit (oder gar nicht - nicht empfohlen) aufrufen und das Speichern/Wiederherstellen von einem Paketobjekt funktioniert trotzdem. – Machinarius

+0

@Machinarius Ich schaute [SaveState] (http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState) ... was ist der empfohlene Weg dann? (wirklich neugierig) –

+0

In der Tat sollten Sie '' super.onSaveInstanceState (outState); '' Aber es ist wirklich optional AFAIK, Wenn Sie es nicht aufrufen, dann wird Ihre UI Zustand nie wiederhergestellt werden und neue Aktivitäten von vorne anfangen, aber es sollte nicht zu einem Fehler führen. – Machinarius

1

Zwei Probleme, die ich habe in Ihren Codes gesehen, die gelöst werden sollten.

  • ObjectivesLogic Klasse erweitert Activity Klasse, die als erscheint es nicht braucht. Außerdem sollten Sie niemals eine Klasse instanziieren Activity manuell erweitern, sollte dies von Android-Framework nicht Sie getan werden.

  • Sie speichern nur diese Variable: outState.putInt("Count",save);. Ich konnte nichts über die Wiederherstellung sehen.

Verwandte Themen