Wiederherstellen eines Layouts - funktioniert nicht wirklich so...

  • 6 Antworten
  • Neuester Beitrag
Diskutiere Wiederherstellen eines Layouts - funktioniert nicht wirklich so... im Android App Entwicklung im Bereich Betriebssysteme & Apps.
A

Andrez

Fortgeschrittenes Mitglied
Hallo Leute,

ich habe ein klitzekleines Problemchen und zwar habe ich eine ArrayList von einem Cutsom Object diese wird in der Methode onSaveInstantState gespeichert.
Code:
@Override
		protected void onSaveInstanceState( Bundle outState )
			{
				Log.w( "TestEingabe", "onSaveInstantState" );
				outState.putParcelableArrayList( SAVED_LIST, savedList );
				super.onSaveInstanceState( outState );
			}
und in der Methode onRestoreInstantState wiederhergestellt
Code:
@Override
		protected void onRestoreInstanceState( Bundle savedInstanceState )
			{
				Log.d( "TestEingabe", "onRestoreSaveInstantState" );
				if ( !( savedInstanceState == null ) )
					{
						savedList = savedInstanceState.getParcelableArrayList( SAVED_LIST );
						for ( int i = 0; i < savedList.size(); i++ )
							{
								savedList.get( i ).addItem();
							}
					}

				super.onRestoreInstanceState( savedInstanceState );
			}
die Methode addItem() ist in der Object Klasse von mir definiert worden:
Code:
void addItem()
			{
				newRow = (ViewGroup) LayoutInflater.from( context ).inflate( layoutID, viewGroup, false );

				( (TextView) newRow.findViewById( android.R.id.text1 ) ).setText( fach );
				( (TextView) newRow.findViewById( android.R.id.text2 ) ).setText( String.valueOf( this.punkte ) );

				viewGroup.addView( newRow, 0 );
			}
leider ist nach dem onRestoreInstantState nichts zu sehen.
Muss ich irgendwie eine UpdateLayout - Methode aufrufen?
oder wo liegt mein Fehler?

Danke für die Antworten!!
 
A

amfa

Experte
Woher bekommt dein Object denn seine Werte?
z.B. context, layoutID, viewGroup etc.?

Hast du in deinem Objekt Parceable richtig implementiert?

Ansonsten zeig mal den ganzen Code.
 
A

Andrez

Fortgeschrittenes Mitglied
Code:
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fach implements Parcelable
	{

		ViewGroup      viewGroup;
		Context        context;
		ViewGroup      newRow;

		private int    punkte;
		private int    semester;
		private String fach;
		private int    layoutID;
		private int    kursGrad;

		Fach( ViewGroup viewGroup, Context context, int layoutID, int kursGrad )
			{
				this.context = context;
				this.viewGroup = viewGroup;
				this.layoutID = layoutID;
				this.kursGrad = kursGrad;
			}

		public Fach( Parcel in )
			{
			 punkte = in.readInt();
			 semester = in.readInt();
			 fach = in.readString();
			 layoutID = in.readInt();
			 kursGrad = in.readInt();
			}

		void addItem()
			{
				newRow = (ViewGroup) LayoutInflater.from( context ).inflate( layoutID, viewGroup, false );

				( (TextView) newRow.findViewById( android.R.id.text1 ) ).setText( fach );
				( (TextView) newRow.findViewById( android.R.id.text2 ) ).setText( String.valueOf( this.punkte ) );

				viewGroup.addView( newRow, 0 );
			}

		public String getFach()
			{
				return fach;
			}

		public void setFach( String fach )
			{
				this.fach = fach;
			}

		public int getPunkte()
			{
				return this.punkte;
			}

		public void setPunkte( int punkte )
			{
				this.punkte = punkte;
			}

		public int getSemester()
			{
				return semester;
			}

		public void setSemester( int semester )
			{
				this.semester = semester;
			}

		public int getLayoutID()
			{
				return layoutID;
			}

		public void setLayoutID( int layoutID )
			{
				this.layoutID = layoutID;
			}

		public int getKursGrad()
			{
				return kursGrad;
			}

		public void setKursGrad( int kursGrad )
			{
				this.kursGrad = kursGrad;
			}

		public static final Parcelable.Creator <Fach> CREATOR = new Parcelable.Creator <Fach>()
			                                                      {
				                                                      public Fach createFromParcel( Parcel in )
					                                                      {
						                                                      return new Fach( in );
					                                                      }

				                                                      public Fach[] newArray( int size )
					                                                      {
						                                                      return new Fach[size];
					                                                      }
			                                                      };

		@Override
    public int describeContents()
	    {
		    // TODO Auto-generated method stub
		    return 0;
	    }

		@Override
    public void writeToParcel( Parcel dest, int flags )
	    {
		    // TODO Auto-generated method stub
		    
	    }

	}
das ist der gesammte Code von der "Fach" - Klasse von der dann die anderen Klassen wie "Hauptfach" etc erben
 
A

amfa

Experte
Meiner Meinung nach musst du z.B. die context variable auch in dem Constructor setzen, der das Parcable als Parameter übergeben bekommt.

Was im Moment passiert, wenn dein Fach Objekt wieder hergestellt wird ist folgendes:
Es wird ein neus Fach-Objekt erstellt und es werden alle int Werte gesetzt und der fach String.
context ist danach aber null, ViewGroup ist null.

UND was ich gerade erst gesehen hab, du musst die writeToParcel() Methode implementieren!

Im Moment dürfte das Fach Objekt, dass du ausliest komplett leer sein.
Weil du die Werte ja nie in das Parcel schreibst.
Das kann so nicht funktionieren.
 
A

Andrez

Fortgeschrittenes Mitglied
Ich hab das nicht wirklich verstanden, wie soll ich den Context übergeben? ich kann nämlich nur in.putInt() in.putString() etc übergeben...ich hab es jetzt sehr schlecht aber sehr einfach gelöst:
Code:
protected void onRestoreInstanceState( Bundle savedInstanceState )
			{
				Log.d( "TestEingabe", "onRestoreSaveInstantState" );
				if ( !( savedInstanceState == null ) )
					{
						savedList = savedInstanceState.getParcelableArrayList( SAVED_LIST );
						for ( int i = 0; i < savedList.size(); i++ )
							{
								Log.w( "test", savedList.get( i ).getFach() );
								if(savedList.get( i ).getKursGrad() == HAUPTFACHGK)
									{
										HauptFachGK hauptFachGK = new HauptFachGK( mGroup, context, R.layout.row_pruefungsfach_gk, HAUPTFACHGK );
										hauptFachGK.setFach( savedList.get( i ).getFach() );
										hauptFachGK.setPunkte( savedList.get( i ).getPunkte() );
										hauptFachGK.setSemester( savedList.get( i ).getSemester() );
										hauptFachGK.setKursGrad( savedList.get( i ).getKursGrad() );
										hauptFachGK.addItem();
									}
								if(savedList.get( i ).getKursGrad() == HAUPTFACHLK)
									{
										HauptFachLK hauptFachLK = new HauptFachLK( mGroup, context, R.layout.row_pruefungsfach_lk, HAUPTFACHLK );
										hauptFachLK.setFach( savedList.get( i ).getFach() );
										hauptFachLK.setPunkte( savedList.get( i ).getPunkte() );
										hauptFachLK.setSemester( savedList.get( i ).getSemester() );
										hauptFachLK.setKursGrad( savedList.get( i ).getKursGrad() );
										hauptFachLK.addItem();
									}
								if(savedList.get( i ).getKursGrad() == SONSTFACH)
									{
										SonstFach sonstFach = new SonstFach( mGroup, context, R.layout.row_sonstfach, SONSTFACH );
										sonstFach.setFach( savedList.get( i ).getFach() );
										sonstFach.setPunkte( savedList.get( i ).getPunkte() );
										sonstFach.setSemester( savedList.get( i ).getSemester() );
										sonstFach.setKursGrad( savedList.get( i ).getKursGrad() );
										sonstFach.addItem();
									}
								
							}
					}

				super.onRestoreInstanceState( savedInstanceState );
			}
Könntest du mir vielleicht erklären was parcelable bedeutet und wie dasimplementiert wird? Ich versteh wirklich nicht wie ich den Context etc übergeben kann
Denn ich habe kein leeres Fach Object - denn den String und die Ints besitzt es - nur angezeigt wird es nicht :(( mit meiner jetzigen Lösung funzt es
 
Zuletzt bearbeitet:
A

amfa

Experte
Was du z.b. machen könntest wäre folgendes:
Fach fach = savedList.get( i );
fach.setContext(...);
fach.addItem();

Dann musst du halt noch die setContext Methode einbauen.
Das gleiche müsstst du für die ViewGroup auch machen.

Aber evtö wäre es besser, wenn das Fach gar nichts vom Context weiß.
DU baust dir in der gleichen Klasse in der onRestoreInstanceState() steht eine Methode, die du beispielsweise
addFach(Fach fach)
nennst das Fach hat nur noch seine eigenen Werte und kennt weder Context, noch ViewGroup.

Code:
void addFach(Fach fach, Context context, int layoutID, ViewGroup viewGroup){
    ViewGroup newRow = (ViewGroup) LayoutInflater.from( context ).inflate( layoutID, viewGroup, false );
    ( (TextView) newRow.findViewById( android.R.id.text1 ) ).setText( fach.getFach() );
    ( (TextView) newRow.findViewById( android.R.id.text2 ) ).setText( String.valueOf( fach.getPunkte() ) );
    viewGroup.addView( newRow, 0 );
    }
Dann hast du nämlich deine Daten und deine Logik bzw dein layout sauberer getrennt.
 
A

Andrez

Fortgeschrittenes Mitglied
Also du hast dir ein großes Lob verdient xD
Danke das du mir geholfen hast, da ich aber die Fach Klasse abstract habe und noch andere Klassen von dieser erben ist die erste vorgeschlagene Methode die bessere denn es müssen ja auch ein paar OnClickListener gesetzt werden. Diese habe ich in der MainActivity lieber da der gesammte Aufbau bisl komplexer ist. Danke nochmal für deine Hilfe bloß mit dem Parselable komm ich noch nicht wirklich klar...
 
Ähnliche Themen - Wiederherstellen eines Layouts - funktioniert nicht wirklich so... Antworten Datum
4
28
8