2010-07-16 10 views
38

ठीक है .. मुझे कुछ वास्तविक सरल दिखाना चाहिए, लेकिन मुझे लगता है कि मैं कुछ मूलभूत करने की कोशिश कर रहा हूं .. बस अभिविन्यास परिवर्तन पर स्क्रॉलव्यू की स्क्रॉलबार स्थिति को बनाए रखें ...स्क्रॉलव्यू .scroll काम नहीं कर रहा है? रोटेशन पर स्क्रॉलव्यू स्थिति सहेजना

यहां मेरे ऑनसेवेंसस्टेट और ऑनस्टोर इंस्टेंसस्टेट के लिए कोड है .. sView स्क्रॉलव्यू लेआउट के लिए कंटेनर है। मेरे स्क्रॉलव्यू के भीतर बहुत सारे टेक्स्टव्यू के साथ एक लाइनरलेआउट है।

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

} 

अगर मैं पुनर्स्थापित पर sViewX और sViewY के मूल्यों के साथ एक टोस्ट निर्धारित करते हैं, मान रखा और सही कर रहे हैं।

संपादित करें: मैंने बस एक sView.scrollTo (0,150) करने की कोशिश की; मेरे ऑनक्रेट में .. बस यह देखने के लिए कि क्या यह 150px पर गतिविधि को खोल देगा, और ऐसा नहीं हुआ। मुझे लगता है कि मेरी समस्या को .scrollTo विधि से करना है।

+1

संदर्भ के लिए, यदि आप टुकड़ों का उपयोग करते हैं, तो RestoreInstanceState को एक्टिविटीक्रेटेड() विधि पर जाना होगा। साथ ही, इसके लिए जांचना याद रखें: अगर (savedInstanceState! = Null) –

उत्तर

111

मैंने इसे समझ लिया।

चूंकि मैं setText को onCreate में टेक्स्ट व्यूज़ का उपयोग कर रहा हूं, .scrollTo पर कॉल नहीं करेगा।

तो अब मैं उपयोग कर रहा हूँ निम्नलिखित:

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

जब मैंने इसे थ्रेड के साथ करने की कोशिश की है तो इससे कोई प्रभाव नहीं पड़ेगा? –

+7

मुझे यह समझ में नहीं आता है, लेकिन ऐसा लगता है कि यह काम करता है! धन्यवाद। –

+0

यह वास्तव में समझ में आता है, लेकिन जब मैं इसे वेबव्यू पर लागू करने का प्रयास करता हूं, तो यह काम नहीं करता है। – TacB0sS

0

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() बस जल्दी दृश्य स्क्रॉल करने के लिए है। यही कारण है कि नई रननेबल पोस्ट करने में मदद करता है, लेकिन हमेशा नहीं। कभी-कभी किसी को भी इसे काम करने के लिए postDelayed() का उपयोग करना पड़ता है। टुकड़ा के लिए एक के बजाय onViewCreated (उपयोग कर सकते हैं):

@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

यह मैं

@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

आप स्क्रॉल शुरू कर देना चाहिए के बाद से स्क्रॉल काम नहीं करता तक घटकों नहीं बनाई गई हैं से पहले घटक तैयार कर रहे हैं के लिए काम कर रहा है:

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

इसके बजाय अगले रन पाश करने के लिए स्क्रॉल कार्रवाई भेजने के लिए, आप अपने दृश्य स्क्रॉल कर सकते हैं वैश्विक लेआउट कॉलबैक में:

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    sView.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       sView.scrollTo(sViewX, sViewY); 
      } 
     } 
    ); 
} 
संबंधित मुद्दे