2010-07-16 27 views
38

Ok .. Tôi phải xem cái gì đó thật đơn giản ở đây, nhưng tôi nghĩ tôi đang cố gắng làm một cái gì đó khá cơ bản .. Chỉ cần giữ vị trí cuộn của ScrollView theo hướng thay đổi ...ScrollView .scrollĐể không hoạt động? Lưu vị trí ScrollView khi xoay

Đây là mã cho onSaveInstanceState của tôi và onRestoreInstanceState .. sView là vùng chứa cho bố cục ScrollView. Trong scrollview của tôi là một linearlayout với rất nhiều textviews.

@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); 

} 

Nếu tôi đặt Bánh mì nướng với giá trị của sViewX và sViewY trên Khôi phục, giá trị được giữ và sửa.

Chỉnh sửa: Tôi vừa cố gắng thực hiện sView.scrollTo (0,150); trong onCreate của tôi .. chỉ để xem liệu điều đó có mở hoạt động ở mức 150px hay không, và điều đó không xảy ra. Tôi nghĩ rằng vấn đề của tôi phải làm với phương thức .scrollTo.

+1

Để tham khảo, nếu bạn sử dụng phân đoạn, onRestoreInstanceState phải truy cập phương thức onActivityCreated(). Ngoài ra, hãy nhớ kiểm tra: if (savedInstanceState! = Null) –

Trả lời

111

Tôi đã tìm ra.

Vì tôi đang sử dụng setText cho TextViews trong số onCreate của mình, hãy gọi .scrollTo sẽ không hoạt động.

Vì vậy, bây giờ tôi đang sử dụng như sau:

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

Khi tôi đã thử nó với chủ đề ra nó sẽ không làm cho bất kỳ hiệu ứng y như vậy? –

+7

Tôi không hiểu, nhưng có vẻ như nó hoạt động! Cảm ơn. –

+0

Điều này thực sự có ý nghĩa, nhưng khi tôi cố gắng áp dụng điều này cho một webview, nó không hoạt động. – TacB0sS

0

Đối 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() là chỉ để sớm để di chuyển xem. Đó là lý do tại sao đăng Runnable mới giúp, nhưng không phải lúc nào. Đôi khi một người thậm chí phải sử dụng postDelayed() để cho phép nó hoạt động. Đối Fragment người ta có thể sử dụng onViewCreated() thay vì:

@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

này đang làm việc cho tôi

@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

Bạn nên bắt đầu cuộn trước khi các thành phần được rút ra, kể từ khi cuộn không hoạt động các thành phần cho đến khi không được tạo ra:

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

Thay vì gửi tác vụ cuộn đến vòng lặp chạy tiếp theo, bạn có thể cuộn chế độ xem của mình trong gọi lại bố cục chung:

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    sView.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       sView.scrollTo(sViewX, sViewY); 
      } 
     } 
    ); 
} 
Các vấn đề liên quan