2010-07-16 11 views
38

Ok .. Ich muss etwas wirklich einfach hier übersehen, aber ich denke, ich versuche, etwas ziemlich einfach zu tun .. Einfach die Scrollleiste Position eines ScrollView auf Orientierungsänderung halten ...ScrollView .scrollTo funktioniert nicht? Speichern von ScrollView-Position bei Rotation

Hier ist der Code für meine onSaveInstanceState und OnRestoreInstanceState .. sView ist der Container für das ScrollView-Layout. In meinem scrollview ist ein lineares Layout mit vielen Textansichten.

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    //---save whatever you need to persist— 

    outState.putInt("sViewX",sView.getScrollX()); 
    outState.putInt("sViewY",sView.getScrollY()); 

super.onSaveInstanceState(outState); 

} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
    super.onRestoreInstanceState(savedInstanceState); 

    sViewX = savedInstanceState.getInt("sViewX"); 
    sViewY = savedInstanceState.getInt("sViewY"); 

    sView.scrollTo(sViewX, sViewY); 

} 

Wenn ich einen Toast mit den Werten von sViewX und sViewY auf der Wiederherstellung festgelegt, werden die Werte gehalten und richtig ist.

Edit: Ich habe gerade versucht, eine sView.ScrollTo (0,150); in meinem onCreate .. nur um zu sehen, ob das würde die Aktivität bei 150px nach unten öffnen, und es tat es nicht. Ich denke, mein Problem hat mit der .scrollTo-Methode zu tun.

+1

Wenn Sie als Referenz Fragmente verwenden, muss onRestoreInstanceState in die onActivityCreated() -Methode gehen. Denken Sie auch daran zu überprüfen: if (savedInstanceState! = Null) –

Antwort

111

Ich habe es herausgefunden.

Da ich setText zu TextViews in meinem onCreate verwende, funktioniert das Aufrufen von .scrollTo nicht.

So, jetzt bin ich mit der folgenden:

sView.post(new Runnable() { 
    @Override 
    public void run() { 
     sView.scrollTo(sViewX, sViewY); 
    } 
}); 
+0

Wenn ich es mit out-Thread versucht habe, wird es keinen Effekt y so machen? –

+7

Ich verstehe es nicht, aber es scheint zu funktionieren! Vielen Dank. –

+0

Das macht eigentlich Sinn, aber wenn ich versuche, dies auf eine Webansicht anzuwenden, funktioniert es nicht. – TacB0sS

0

Für MVVMCross:

protected override void OnSaveInstanceState(Bundle outState) 
{ 
    base.OnSaveInstanceState(outState); 

    ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView); 
    int posY = sv.ScrollY; 

    outState.PutInt("scrollY", posY); 
} 

protected override void OnRestoreInstanceState(Bundle savedInstanceState) 
{ 
    base.OnRestoreInstanceState(savedInstanceState); 

    ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView); 
    int posY = savedInstanceState.GetInt("scrollY"); 

    sv.Post(new Runnable(new Action(() => sv.ScrollTo(0, posY)))); 
} 
1

onRestoreInstanceState() ist nur zu früh, um die Ansicht zu scrollen. Aus diesem Grund hilft das Hochladen neuer Runnable, aber nicht immer. Manchmal muss man sogar postDelayed() verwenden, damit es funktioniert. Für Fragment kann man verwenden onViewCreated() statt:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    sViewX = savedInstanceState.getInt("sViewX"); 
    sViewY = savedInstanceState.getInt("sViewY"); 
    sView.scrollTo(sViewX, sViewY); 
} 
1

Dies ist für mich arbeiten

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putInt(SystemGlobal.SCROLL_Y, mRelativeLayoutMain.getTop()); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onRestoreInstanceState(savedInstanceState); 
    mRelativeLayoutMain.scrollTo(0, savedInstanceState.getInt(SystemGlobal.SCROLL_Y)); 
} 
0

Sie sollten blättern beginnen, bevor Komponenten gezogen werden, da blättern nicht, bis Komponenten funktioniert nicht erstellt werden:

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    scrollView.scrollTo(.... 
0

Stattdessen blättern Aktion zur nächsten Laufschleife senden, können Sie die Ansicht in der globalen Layout Rückruf blättern:

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    sView.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       sView.scrollTo(sViewX, sViewY); 
      } 
     } 
    ); 
} 
Verwandte Themen