เหตุใดกิจกรรม 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
โดยใช้วิธีการเต็มตามที่อธิบายไว้ด้านล่างและวิธีการเลื่อนตามที่อธิบายไว้ด้านล่าง ฉันไม่จำเป็นต้องคิดที่จะแก้ไขด้วยวิธีนี้ แต่ต้องมีเหตุผลว่าทำไมมันถึงเริ่มแบบนั้นและฉันอยากจะแก้ไขด้วยการแก้ไข
MrGibbage

คำตอบ:


307

เมื่อ Android เริ่มกิจกรรมการควบคุมบางอย่างจำเป็นต้องโฟกัส เมื่อไม่มีการควบคุมที่กำหนดให้โฟกัสระบบจะเลือกตัวควบคุมแรกที่มีสิทธิ์ซึ่งต้องการโฟกัส หากคุณตั้งค่าคุณสมบัติต่อไปนี้ใน LinearLayout android:focusableInTouchMode="true"ของคุณคุณLinearLayoutจะมุ่งเน้นไปที่การเริ่มต้นและกิจกรรมของคุณจะไม่เลื่อนไปEditTextที่ด้านล่าง


ไม่ทำงานใน GridLayout ของฉัน ฉันมี GridView อยู่ตรงกลางเค้าโครงและได้รับโฟกัสทุกครั้ง
Iqbal

2
เกาหัวของฉันมาทั้งวันและไม่พบว่าเหตุใดจึงเกิดขึ้นในกิจกรรมใดกิจกรรมหนึ่งและฉันยังไม่เข้าใจเนื่องจากฉันไม่ได้เปิดใช้งานการโฟกัสในมุมมองใด ๆ แต่ต้องขอบคุณคุณฉันสามารถแก้ไขปัญหานี้ได้ จะดีมากถ้ามีใครบางคนสามารถบอกเหตุผลที่อาจเป็นไปได้เนื่องจากไม่มีอะไรใหม่ที่ฉันกำลังทำในกิจกรรมใหม่นี้
Shubhral

2
หมายเหตุสำคัญ: สิ่งนี้จะถูกเพิ่มเป็นคุณสมบัติLinearLayoutภายในScrollViewไม่ใช่ในมุมมองแบบเลื่อนเอง
Boris Strandjev

@BorisStrandjev หมายเหตุสำคัญมาก ควรจะเพิ่มคำตอบ ยัง
ไง

มีการกล่าวถึงคำตอบอย่างแท้จริง
devmiles.com

35

แทนที่จะทำให้ไอเท็มเป็นมลพิษในเลย์เอาต์ของคุณคุณสามารถเพิ่มสิ่งนี้ลงในกิจกรรม / คลาสของคุณ:

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

วิธีนี้ไม่ใช่องค์ประกอบภายใน scrollView ของคุณที่จะได้รับโฟกัส แต่ scrollView ของคุณเป็นคอนเทนเนอร์ซึ่งเป็นจุดสนใจแรกย้ายไปยังมุมมองเด็กหลังจากนี้


ใช้งานได้บางส่วนสำหรับฉันเมื่อฉันพยายามตั้งค่าความสูง ListView ตามเด็กใน ScrollView
Konstantin Konopko

สิ่งนี้ช่วยได้! (ในขณะที่แอตทริบิวต์เดียวกันใน xml ไม่ทำงาน .. )
Matan Dahan

ใช้งานได้เหมือนมีเสน่ห์! Thx
Bogy

มันได้ผลสำหรับฉัน แต่ฉันเพิ่มบรรทัดนี้: scrollView.fullScroll (ScrollView.FOCUS_UP) ทั้งสองแยกกันไม่ทำงาน
Juan Giorello

3

คุณสามารถลองใช้รหัสนี้:

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

[N: B] [ลิงก์อ้างอิง] 1


1
มันเป็นตัวเลือกที่ดี แต่มันจำลองการกระตุกหลังจากเปิดดังนั้นฉันคิดว่าไม่ใช่ประสบการณ์การใช้งานที่ดี
iBabur

2

พร้อมกับสิ่งที่ devmiles.com กล่าว

หากคุณตั้งค่าคุณสมบัติต่อไปนี้ใน LinearLayout - android: focusableInTouchMode = "true" LinearLayout ของคุณจะถูกโฟกัสที่จุดเริ่มต้นและกิจกรรมของคุณจะไม่เลื่อนไปที่ EditText ที่ด้านล่าง

หากคุณเรียก requestLayout () ในมุมมองที่ด้านล่างของเลย์เอาต์เชิงเส้นอาจขโมยโฟกัสจากมุมมองด้านบนสุดของคุณ ดังนั้นเพียงแค่เรียก requestFocus () ที่มุมมองด้านบนสุดในเค้าโครงเชิงเส้นหลังจากเรียก requestLayout () ในมุมมองที่ต่ำกว่า



1

สำหรับการพัฒนา Xamarin Android หากคุณต้องการทำ @Graeme solution แล้ว:

// 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 ก็มักจะขโมยโฟกัสและมีปัญหากับมัน วิธีแก้ไขคือใช้ไฟล์. หวังว่าสิ่งนี้จะช่วยใครสักคนฉันเสียเวลาอย่างน้อยหนึ่งชั่วโมง :)ScrollViewVideoViewTextureView

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.