स्क्रॉल करने के लिए कैसे स्क्रॉल करें?


162

मेरे ऐप के कुछ हिस्सों के लिए, उपयोगकर्ता को नामों की एक सूची के साथ प्रस्तुत किया जाता है और उन्हें फिट होने के लिए उन्हें समूह में रखने के लिए कहा जाता है।

(ध्यान दें, सूची दृश्य कोड को एंड्रॉइड व्यू ट्यूटोरियल से वर्बेटिम कॉपी किया गया था। मैंने अभी तक इसे अपनी आवश्यकताओं के लिए अनुकूलित नहीं किया है, मैं केवल यह पता लगाने की कोशिश कर रहा हूं कि यह काम कैसे किया जाए।)

मूल लेआउट एक LinearLayout है, जिसमें स्क्रॉलव्यू (नीचे दिए गए कोड में "groupScrollView" कहा जाता है), जिसमें RelativeLayout शामिल है। मेरे पास कुछ बटन और पाठ है, और फिर उसके नीचे मेरी सूची दृश्य, जो नामों की सूची प्रदर्शित करता है। यह सब दृश्य स्क्रीन क्षेत्र की तुलना में लंबा है, इसलिए उपयोगकर्ता को यह सब देखने के लिए लंबवत स्क्रॉल करने की अनुमति है।

यह सब सुंदर तरीके से काम करता है, सिवाय इसके कि जब पृष्ठ लोड होता है तो यह हमेशा मेरी सूची के शीर्ष पर पूर्व-स्क्रॉल किया जाता है - पृष्ठ के मध्य में। मेरे द्वारा बनाया गया पाठ और बटन उपयोगकर्ता को यह बताता है कि क्या करना है, दिखाई नहीं दे रहा है।

मैं स्क्रीन को पकड़ सकता हूं और स्क्रॉल कर सकता हूं, यह ठीक काम करता है, लेकिन मैं चाहूंगा कि स्क्रीन को पहले से ही स्क्रॉल किया जाए। उपयोगकर्ता को ताज़ा लोड किए गए पृष्ठ के शीर्ष को देखने के लिए UP स्क्रॉल नहीं करना चाहिए। लेकिन मैंने जो भी प्रोग्राम स्क्रीन के शीर्ष पर स्क्रॉल करने का प्रयास किया है वह विफल हो गया है।

यहाँ मेरा तरीका है विधि:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}

लाइन "mainScrollView.pageScroll (View.FOCUS_UP); समस्या है। यह एक त्रुटि का कारण नहीं है, लेकिन यह कुछ भी करने के लिए प्रतीत नहीं होता है। मैंने स्क्रॉल (0,0), स्क्रॉलडायरेक्शन (View .OCUS_UP) की कोशिश की है। ), और बाकी सब मैं सोच सकता हूं।

चूंकि मुझे कोई त्रुटि नहीं मिलती है, इसलिए मुझे यह मान लेना होगा कि ये स्क्रॉल कमांड वास्तव में काम कर रहे हैं, लेकिन वे स्क्रॉल व्यू या रिलेलेटलाइयूट के शीर्ष के बजाय सूची दृश्य के शीर्ष पर स्क्रॉल कर रहे हैं। ऐसा लगता है कि Google द्वारा स्क्रॉलटो (int x, int y) विधि के अपने विवरण की पुष्टि की जाती है, जहां वे कहते हैं कि "यह संस्करण स्क्रॉलिंग को हमारे बच्चे की सीमा में भी जकड़ता है।"

तो लंबे समय तक एक लंबा सवाल बनाने के लिए, मैं स्क्रॉल स्क्रीन के भीतर मौजूद स्क्रीन पर विचारों का एक समूह कैसे लोड करूं, और फिर प्रोग्रामेटिक रूप से पृष्ठ के शीर्ष पर पूरी चीज़ को स्क्रॉल करूं ताकि उपयोगकर्ता इसके साथ बातचीत कर सके?

धन्यवाद!

जवाबों:


264

प्रयत्न

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

यह काम करना चाहिए।


मेरे लिए भी काम करता है। : डी
मुंतसिर अोनिक

1
मैंने स्क्रॉलव्यू # fullScroll () वर्तमान फ़ोकस को बदला। मैंने EditText के साथ परीक्षण किया।
भ्रमजाल

175

एक ही मुद्दा था, शायद किसी तरह का बग।

यहां fullScroll(ScrollView.FOCUS_UP)तक कि दूसरे जवाब से भी काम नहीं चला। डायलॉग दिखाए जाने के बाद ही
मेरे लिए काम करने वाली चीज scroll_view.smoothScrollTo(0,0)सही कह रही थी ।


इसने शुरुआत में काम किया, लेकिन बाद में जब मैंने इसे बार-बार करने की कोशिश की, तो इस दृष्टिकोण ने संतोषजनक परिणाम नहीं दिया।
JaydeepW

16
मैं scroll_view.smoothScrollTo (0,0) से हल करता हूं, जब हमारे पास साइडव्यू में उस समय के लिस्टव्यू होते हैं, तो fullScroll (ScrollView.FOCUS_UP) काम नहीं करेगा।
कीर्तिकुमार ए।

1
scroll_view.smoothScrollTo (0,0) ने मेरे लिए mainScrollView.fullScroll (ScrollView.FOCUS_UP) से बेहतर काम किया; धन्यवाद!
मारिनेके

2
अधिकांश उपकरणों पर फुलस्क्राॅल (स्क्रॉलव्यू.एफओयूसी_यूपी) ने काम किया, लेकिन नेक्सस 5 और उन उपकरणों पर जहां मेरे पास पाठ का आकार था, पूरे फुलस्क्रीन को एक्शनबार के तहत स्थानांतरित किया गया, स्मूथसक्रोल्टो (0,0) ने सभी उपकरणों में बेहतर काम किया।
jt-gilkeson

इसका यह भी फायदा fullScroll()है कि यह इस कदम के बाद चयनित वस्तु को अभी भी चयनित रखता है। साथ fullScroll(), scrollview में पहला आइटम मेरे मामले में हर बार reselected किया गया था, चयनित आइटम के स्वतंत्र होने से पहले स्क्रॉल ऊपर की तरफ ले जाया गया।
GeertVc

97

मैं एक ही समस्या थी और यह तय किया। आशा है कि यह आपकी मदद करता है।

listView.setFocusable(false);

3
ग्रिड ग्रिड के लिए भी यह सही समाधान है। ऐसा तब होता है जब आपके पास एक ही दृश्य समूह में एक से अधिक दृश्य तत्व होते हैं, विशेष रूप से सूची या ग्रिडव्यू के शीर्ष पर एक और सूची। चूंकि एडाप्टर UI थ्रेड को सूचित करता है, इसलिए दृश्य को फिर से बनाया गया है और पहले तत्व तक स्क्रॉल करता है। बस listView.setFocusable (false) / gridView.setFocusable (गलत) को कॉल करें। यदि आप इसे xml फ़ाइल से करते हैं, तो यह काम नहीं करेगा।
ओमर्स

इस समाधान ने मेरे मामले में भी काम किया, मेरे पास NestedScrollView के अंदर RecyclerView था इसलिए यह ऑटो स्क्रॉलिंग डाउन था। धन्यवाद दोस्त!
नीलेश राठौर

मुझे एडेप्टर सेट करने से पहले इसे जोड़ना था लेकिन उसके बाद एक आकर्षण की तरह काम करता है। धन्यवाद
समुदाय

सही स्पष्टीकरण !!
बोरजा लोपेज

स्पष्टीकरण के लिए मिगुएल और विशेष रूप से ओमर्सम दोनों का धन्यवाद, विशेष रूप से यह कि XML में सेट होने पर यह कैसे काम करेगा, इसने मुझे कुछ सिरदर्द से बचाया
buradd

53

scrollViewObject.fullScroll(ScrollView.FOCUS_UP)यह ठीक काम करता है, लेकिन केवल इस लाइन के साथ समस्या यह है कि, जब स्क्रॉलवॉबजेक्ट में डेटा पॉप्युलेट हो रहा है, तो इसे तुरंत कॉल किया गया है। डेटा के पॉप्युलेट होने तक आपको कुछ मिलीसेकंड का इंतजार करना होगा। इस कोड को आज़माएं:

scrollViewObject.postDelayed(new Runnable() {
    @Override
    public void run() {
        scroll.fullScroll(ScrollView.FOCUS_UP);
    }
}, 600);

या

 scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});

मैं उसी मुद्दे से निपट रहा था जहां स्क्रॉलव्यू को पृष्ठ के निचले हिस्से तक स्क्रॉल किया जाना था, इसे ठीक किया गया!
मशीन जनजाति

1
मिलीसेकंड के "जादू" x संख्या का अनुमान लगाने के बजाय, आपको प्रतीक्षा करनी होगी, देखें ऑब्जेक्ट एक पोस्ट (रन करने योग्य) विधि की पेशकश करते हैं जिसका आप उपयोग कर सकते हैं कि UI पर विजेट रेंडर करने के बाद रननीय पोस्ट किया जाएगा।
रेयान

@ रियान: पोस्ट (रन करने योग्य) हमेशा नेक्सस 5 (जीनोमिशन) पर मेरे लिए काम नहीं करता है
Dika

पोस्ट (रननेबल) काम नहीं कर सकता है क्योंकि यदि आप इन्फ्लूएंस स्टेप के बाद डेटा लाते हैं, जैसा कि पहले स्क्रॉल काम करता है और फिर डेटा व्यू में पॉप्युलेट होता है। तो आप या तो आपको पोस्टडेलड (रननेबल, डमीमिलिस) का उपयोग करना चाहिए या आपको डेटा पॉपुलेटेड प्रक्रियाओं के बाद स्क्रॉल.फुलक्रोकल (स्क्रॉलव्यू.फोकस_यूपी) का उपयोग करना चाहिए।
ओगुज़ान

आपका पहला समाधान जिसमें आप स्टेटिक मिल देते हैं, एक बुरा तरीका है।
मालविंदर सिंह

35

इन सभी वैध समाधानों के लिए मुख्य समस्या यह है कि आप स्क्रॉल को स्थानांतरित करने का प्रयास कर रहे हैं जब यह स्क्रीन पर अभी तक नहीं खींचा गया है।

आपको स्क्रीन पर स्क्रॉल दृश्य देखने तक प्रतीक्षा करने की आवश्यकता है, फिर इसे इनमें से किसी भी समाधान के साथ ले जाएं। यह पोस्टडेल से बेहतर समाधान है, क्योंकि आप देरी के बारे में बुरा नहीं मानते हैं।

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });

7
अच्छा समाधान - onGlobalLayoutफोन करने की विधि के अंत में ग्लोबल श्रोता को हटाना न भूलेंscrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Nilhcem

30

बहुत आसान

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

3
मेरे लिए यह काम नहीं किया (तीसरी पंक्ति), समाधान था: स्क्रॉल.फुलक्रोकल (देखें। FOCUS_UP); (अपनी पहली 2 पंक्तियों को शामिल करते हुए)
medskill

@medskill, हाय, क्या आपने इन्हें अपनी xml फ़ाइल में लिखा है? मैं झरना है कि यह केवल में काम करता है onCreate()
imknown

@ imognJ.Kimu मेरे लिए xml फ़ाइल में काम करता है
पेजालियन

इसने मेरे लिए काम किया। आपको दूसरी और तीसरी पंक्ति दोनों की आवश्यकता है। यह मेरे लिए XML में काम नहीं करेगा।
ET

2
अगर मैं कर सकता मैं तुम्हें चूम होता! इस पर 1-2 घंटे बिताए। सबसे अच्छा है जब दो सूचियों को लोड करने के लिए इंतजार करना और उन पर ध्यान केंद्रित नहीं करना था। इसे onResume () में जोड़ा गया।
जॉन टी

24

जब मैं दृश्य फ्लिपर या डायलॉग के अंदर स्क्रॉलव्यू का उपयोग कर रहा हूं, तब भी मुझे यही समस्या आई है, scrollViewObject.fullScroll(ScrollView.FOCUS_UP)तो वह मामला गलत है scrollViewObject.smoothScrollTo(0, 0) मेरे लिए

स्क्रॉल फोकस शीर्ष



9
runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}


6

यह स्क्रॉलव्यू के लिए बल स्क्रॉल है :

            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.scrollTo(0, 0);
                    scrollView.pageScroll(View.FOCUS_UP);
                    scrollView.smoothScrollTo(0,0);
                }
            });

4
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Ready, move up
        scrollView.fullScroll(View.FOCUS_UP);
    }
});

1

मैंने कोटलिन में अपना मुद्दा इस तरह तय किया:

scrollview.isFocusableInTouchMode = true
scrollview.fullScroll(View.FOCUS_UP)
scrollview.smoothScrollTo(0,0)

0
@SuppressWarnings({ "deprecation", "unchecked" })
public void swipeTopToBottom(AppiumDriver<MobileElement> driver) 
                    throws InterruptedException {
       Dimension dimensions = driver.manage().window().getSize();
        Double screenHeightStart = dimensions.getHeight() * 0.30;
        int scrollStart = screenHeightStart.intValue();
        System.out.println("s="+scrollStart);
        Double screenHeightEnd = dimensions.getHeight()*0.90;
        int scrollEnd = screenHeightEnd.intValue();
        driver.swipe(0,scrollStart,0,scrollEnd,2000);
        CommonUtils.threadWait(driver, 3000);
    }

यह सुनिश्चित करने के लिए चलेगा,
अजीत गौर

कृपया इस बात का संक्षिप्त विवरण दें कि यह समस्या कैसे हल करती है।
अयबर्क gzgür
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.