Kenapa aktivitas android saya selalu mulai di scroll ke bawah?

91

Kapanpun saya memulai aktivitas ini, itu selalu dimulai dari bawah - digulir ke bawah. Saya tidak melakukan sesuatu yang aneh dalam aktivitas OnCreate (atau di mana pun dalam hal ini) yang saya harapkan untuk mengubah posisi gulir. Saya telah mencoba mengatur fokus ke kontrol terfokus paling atas, dan metode scrollto, tetapi tidak satupun dari mereka berfungsi. Selain itu, tidak ada aktivitas saya yang memiliki masalah ini. Berikut tata letaknya:

<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>
MrGibbage
sumber
Bagaimana tepatnya Anda mencoba mengubah fokus?
devmiles.com
1
menggunakan metode fulscroll seperti yang dijelaskan di bawah dan metode scrollto seperti yang juga dijelaskan di bawah ini. Saya tidak keberatan memperbaikinya dengan cara ini, tetapi pasti ada alasan mengapa ini dimulai seperti itu dan saya lebih suka memperbaikinya dengan memperbaikinya.
MrGibbage

Jawaban:

307

Saat Android memulai suatu aktivitas, beberapa kontrol perlu difokuskan. Jika tidak ada kontrol yang ditunjuk untuk mengambil fokus, sistem akan memilih kontrol pertama yang memenuhi syarat yang menginginkan fokus. Jika Anda menyetel properti berikut di LinearLayout Anda - android:focusableInTouchMode="true"Anda LinearLayoutakan difokuskan pada awal dan aktivitas Anda tidak akan bergulir ke EditTextbawah.

devmiles.com
sumber
Tidak berfungsi di GridLayout saya. Saya memiliki GridView di tengah tata letak, dan selalu mendapatkan fokus.
Iqbal
2
Menggaruk kepala saya selama satu hari penuh dan tidak dapat menemukan mengapa hal itu terjadi hanya dalam satu aktivitas tertentu dan saya masih tidak mengerti karena saya belum mengaktifkan fokus pada tampilan apa pun. Namun berkat Anda, saya berhasil memperbaiki masalah ini. Akan sangat bagus jika seseorang dapat menjelaskan apa yang mungkin menjadi alasan yang mungkin karena tidak ada hal baru yang saya lakukan dalam aktivitas baru.
Shubhral
2
Catatan penting: ini akan ditambahkan sebagai properti di LinearLayoutdalam ScrollView, bukan ke tampilan gulir itu sendiri.
Boris Strandjev
@BorisStrandjev catatan yang sangat penting. Harus ditambahkan jawabannya. Omong-omong, terima kasih untuk itu: P
Coreggon
Secara harfiah disebutkan dalam jawaban.
devmiles.com
35

Alih-alih mencemari item dalam tata letak Anda, Anda dapat menambahkan ini ke Aktivitas / Kelas Anda:

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

Dengan cara ini, bukan elemen dalam scrollView Anda yang mendapatkan fokus, scrollView Anda sebagai wadah yang mendapatkan fokus pertama, pindah ke tampilan anak setelah ini.

Graeme
sumber
Sebagian berfungsi untuk saya ketika saya mencoba mengatur tinggi ListView berdasarkan anak-anak di dalam ScrollView
Konstantin Konopko
Ini membantu! (sementara atribut yang sama di xml tidak bekerja ..)
Matan Dahan
Bekerja seperti pesona! Thx
Bogy
Itu berhasil untuk saya, tetapi saya menambahkan baris ini: scrollView.fullScroll (ScrollView.FOCUS_UP) Keduanya secara terpisah tidak berfungsi.
Juan Giorello
3

Anda dapat mencoba kode ini:

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

[N: B] [tautan referensi] 1

Komunitas
sumber
1
ini adalah pilihan yang bagus tetapi itu mensimulasikan brengsek setelah dibuka jadi bukan pengalaman pengguna yang baik menurut saya
iBabur
2

Seiring dengan apa yang dikatakan devmiles.com.

Jika Anda menyetel properti berikut di LinearLayout - android: focusableInTouchMode = "true" LinearLayout Anda akan difokuskan saat memulai dan aktivitas Anda tidak akan menggulir ke EditText di bagian bawah.

Jika Anda memanggil requestLayout () pada tampilan di bagian bawah tata letak linier Anda, hal itu mungkin mencuri fokus dari tampilan paling atas Anda. Jadi panggil saja requestFocus () pada tampilan paling atas dalam layout linier setelah memanggil requestLayout () pada tampilan yang lebih rendah.

luca992
sumber
1

Sudahkah Anda mencoba menggunakan metode fullScroll? Http: //developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);
Mike
sumber
1

Untuk pengembangan Xamarin Android, jika Anda ingin melakukan solusi @Graeme maka:

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

Buat saja tidak bisa difokuskan di onCreate ()

editText.setFocusable(false);

dan gunakan

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

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

 ......
 };

dan tidak akan menggulir ke bawah ke Teks Ed di lain waktu, sebuah fragmen atau aktivitas dibuat.

codepeaker
sumber
1

Tambahkan dua baris ini di file ScrollView

 android:focusableInTouchMode="true"
 android:descendantFocusability="blocksDescendants"
Hemendra Gangwar
sumber
0

Saya tidak tahu mengapa tetapi Anda bisa bereksperimen

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

di Anda onCreateuntuk menggulirnya secara manual ke tempat yang Anda inginkan.

zapl
sumber
0

scrollView.requestFocus(View.FOCUS_UP)memecahkan masalah saya ketika saya ingin tampilan atas terlihat. Menentukan parameter arah ke metode requestFocus(int direction)adalah cara yang baik untuk mengontrol ScrollViewposisi. Lebih lengkapnya di sini .

Amit
sumber
0

Dalam kasus saya, saya memiliki a VideoViewinside a ConstraintLayoutinside a ScrollView. Itu VideoViewselalu mencuri fokus, dan ada masalah dengannya . Solusinya adalah dengan menggunakan a TextureView. Semoga ini membantu seseorang, setidaknya saya menghabiskan satu jam :)

Daniel Wilson
sumber