मेरी Android गतिविधि हमेशा नीचे की ओर क्यों स्क्रॉल करना शुरू करती है?


91

जब भी मैं इस गतिविधि को शुरू करता हूं, यह हमेशा नीचे की ओर शुरू होता है - नीचे तक सभी तरह से स्क्रॉल किया जाता है। मैं OnCreate (या उस मामले के लिए कहीं भी) गतिविधि में कुछ भी अजीब नहीं कर रहा हूं कि मैं स्क्रॉल स्थिति को बदलने की उम्मीद करूंगा। मैंने सबसे ऊपरी फ़ोकस करने योग्य नियंत्रण और स्क्रॉल करने की विधि पर ध्यान केंद्रित करने की कोशिश की है, लेकिन दोनों में से कोई भी काम नहीं कर रहा है। इसके अलावा, मेरी किसी भी अन्य गतिविधि में यह समस्या नहीं है। यहाँ लेआउट है:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_refresh_update_header"
            android:textSize="18sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Variable:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_variables_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Network:"
            android:textSize="18sp"/>

        <RadioGroup
            android:id="@+id/widget1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical">

            <RadioButton
                android:text="Web"
                android:id="@+id/edit_refresh_update_rb_web"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"
                android:checked="true"/>

            <RadioButton
                android:text="Socket Server"
                android:id="@+id/edit_refresh_update_rb_socket_server"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"/>
        </RadioGroup>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server request type:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_socket_server_req_types_spinner"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server body:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_ss_body"
            android:layout_height="wrap_content"
            android:enabled="false"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Url:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_url"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <Button
            android:text="Save refresh update"
            android:id="@+id/edit_refresh_save_btn"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginBottom="20dp"
            android:layout_alignParentBottom="true"
            android:onClick="SaveRefreshUpdate">
        </Button>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>
    </LinearLayout>
</ScrollView>

आपने वास्तव में फोकस बदलने की कोशिश कैसे की?
devmiles.com

1
नीचे वर्णित के रूप में फुलस्क्रीन विधि का उपयोग और नीचे वर्णित के रूप में स्क्रॉल विधि भी। मैं जरूरी नहीं कि इसे इस तरह से ठीक करने में कोई आपत्ति हो, लेकिन ऐसा होने का एक कारण होना चाहिए और मैं इसे ठीक करके इसे ठीक करूंगा।
मृग्बेज

जवाबों:


306

जब एंड्रॉइड एक गतिविधि शुरू करता है, तो कुछ नियंत्रण पर ध्यान देने की आवश्यकता होती है। जब फोकस लेने के लिए कोई निर्दिष्ट नियंत्रण नहीं होता है, तो सिस्टम पहला योग्य नियंत्रण चुनता है जो फोकस चाहता है। यदि आप अपने LinearLayout में निम्नलिखित संपत्ति सेट करते हैं - तो android:focusableInTouchMode="true"आपका LinearLayoutप्रारंभ पर ध्यान केंद्रित किया जाएगा और आपकी गतिविधि नीचे में स्क्रॉल नहीं करेगी EditText


मेरे GridLayout में काम नहीं कर रहा। मेरे पास लेआउट के बीच में एक GridView है, और इसे हर बार फोकस मिलता है।
इकबाल

2
एक पूरे दिन के लिए मेरे सिर को खरोंच कर दिया और यह नहीं पाया कि यह सिर्फ एक विशेष गतिविधि में क्यों हो रहा था और मुझे अभी भी समझ नहीं आया क्योंकि मैंने किसी भी दृश्य पर ध्यान केंद्रित करने में सक्षम नहीं किया है। लेकिन आपके लिए धन्यवाद, मैं इस मुद्दे को ठीक करने में कामयाब रहा। यह बहुत अच्छा होगा यदि कोई व्यक्ति कुछ प्रकाश डाल सकता है जैसा कि संभावित कारण हो सकता है क्योंकि नई गतिविधि में कुछ भी नया नहीं है जो मैं कर रहा हूं।
शुभ्र

2
एक महत्वपूर्ण नोट: यह संपत्ति के LinearLayoutअंदर के रूप में जोड़ा जाना है ScrollView, स्क्रॉल दृश्य में ही नहीं।
बोरिस स्ट्रैंडजेव

@BorisStrandjev बहुत महत्वपूर्ण नोट। जवाब में जोड़ा जाना चाहिए। वैसे, इसके लिए धन्यवाद: पी
कोरगॉन

इसका उत्तर में उल्लेख किया गया है।
devmiles.com

35

अपने लेआउट में आइटम प्रदूषित करने के बजाय, आप इसे अपनी गतिविधि / कक्षा में जोड़ सकते हैं:

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

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


आंशिक रूप से मेरे लिए काम करता है जब मैं स्क्रॉल
व्यू के

इससे मदद मिली! (जबकि xml में एक ही गुण काम नहीं किया ..)
मतान दहन

एक जादू की तरह काम करता है! Thx
बोगी

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

3

आप इस कोड को आज़मा सकते हैं:

scroller.post(new Runnable() { 
    public void run() { 
        scroller.fullScroll(ScrollView.FOCUS_DOWN); 
    } 
}); 

[एन: बी] [संदर्भ लिंक]


1
यह एक अच्छा विकल्प है, लेकिन यह एक अच्छा उपयोगकर्ता अनुभव मुझे नहीं लगता कि खोलने के बाद एक झटका लगता है
iBabur

2

साथ ही क्या कहा devmiles.com ने।

यदि आप अपने LinearLayout में निम्न गुण सेट करते हैं - android: focusableInTouchMode = "true" तो आपका LinearLayout शुरू में केंद्रित होगा और आपकी गतिविधि नीचे में EditText तक नहीं जाएगी।

यदि आप अपने रैखिक लेआउट के निचले भाग पर एक दृश्य पर requestLayout () कहते हैं, तो यह आपके शीर्ष सबसे अधिक दृश्य से ध्यान चुरा सकता है। तो बस अनुरोध लेआउट () कम लेआउट पर requestLayout () को कॉल करने के बाद रैखिक लेआउट में सबसे अधिक दृश्य पर कॉल करें।


1

क्या आपने फुलस्क्राॅल पद्धति का उपयोग करने की कोशिश की है? Http: //developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

1

Xamarin Android विकास के लिए, यदि आप @ समाधान करना चाहते हैं तो:

// Set Focus to ScrollView
ScrollView scrollView = (ScrollView)FindViewById(Resource.Id.scrollView);
scrollView.FocusableInTouchMode = true;
scrollView.DescendantFocusability = Android.Views.DescendantFocusability.BeforeDescendants;

1

बस इसे onCreate में ध्यान देने योग्य न बनाएं ()

editText.setFocusable(false);

और उपयोग करें

editText.setOnClickListener(new ....){
 ......
  editText.setFocusable(true);
  editText.setFocusableInTouchMode(true);
  editText.requestFocus();

  showSoftKeyboard(); //Use InputMethodManager to open soft Keyboard

 ......
 };

और यह अगली बार Edittext तक नीचे नहीं जाएगा, एक खंड या गतिविधि बनाई जाती है।



0

मुझे पता नहीं क्यों लेकिन आप के साथ प्रयोग कर सकते हैं

ScrollView sv = (ScrollView) findViewById(R.id.scroll);
sv.scrollTo(0,0);

में अपने onCreateआप इसे स्क्रॉल करने के लिए जहाँ आप इसे पसंद है।


0

scrollView.requestFocus(View.FOCUS_UP)मेरी समस्या हल हो गई जब मैं चाहता था कि शीर्ष दृश्य दिखाई दे। विधि को दिशा पैरामीटर निर्दिष्ट करना स्थिति requestFocus(int direction)को नियंत्रित करने का एक अच्छा तरीका है ScrollView। अधिक जानकारी यहाँ


0

मेरे मामले में मैं VideoViewअंदर ही ConstraintLayoutअंदर एक था ScrollViewVideoViewहमेशा ध्यान देने की चोरी कर रहा है, और वहाँ यह करने में समस्याएं हो । समाधान एक का उपयोग करना है TextureView। उम्मीद है कि यह किसी की मदद करता है, यह मुझे कम से कम एक घंटे की लागत :)

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