Android etkinliğim neden her zaman en alta kaydırılmaya başlıyor?


91

Bu aktiviteye ne zaman başlasam, her zaman aşağıdan başlar - en alta doğru kaydırılır. OnCreate etkinliğinde (veya bu konuda herhangi bir yerde) kaydırma konumunu değiştirmeyi umduğum tuhaf bir şey yapmıyorum. Odağı en üstteki odaklanabilir kontrole ve scrollto yöntemine ayarlamayı denedim, ancak ikisi de çalışmıyor. Ayrıca, diğer faaliyetlerimin hiçbirinde bu sorun yok. İşte düzen:

<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>

Odağı tam olarak nasıl değiştirmeye çalıştınız?
devmiles.com

1
aşağıda açıklandığı gibi fulscroll yöntemini ve ayrıca aşağıda açıklanan scrollto yöntemini kullanarak. Bu şekilde düzeltmeyi umursamıyorum, ama bunun böyle başlamasının bir nedeni olmalı ve bunu düzelterek düzeltmeyi tercih ederim.
MrGibbage

Yanıtlar:


308

Android bir etkinlik başlattığında, bazı kontrollerin odaklanması gerekir. Odaklanacak belirlenmiş bir kontrol olmadığında, sistem odak isteyen ilk uygun kontrolü seçer. Eğer LinearLayout aşağıdaki özelliğini ayarlarsanız - android:focusableInTouchMode="true"senin LinearLayoutbaşından odaklanmış edilecek ve etkinlik olmaz kaydırma için EditTextalt.


GridLayout'umda çalışmıyor. Düzenin ortasında bir GridView var ve her seferinde odaklanıyor.
Iqbal

2
Tam bir gün boyunca kafamı kaşıdım ve neden sadece belirli bir aktivitede olduğunu bulamadım ve herhangi bir görüşe odaklanmayı etkinleştirmediğim için hala anlamıyorum. Ama senin sayende bu sorunu çözmeyi başardım. Yeni aktivitede yaptığım yeni bir şey olmadığından, birisi olası sebebin ne olabileceği konusunda biraz bilgi verebilirse harika olurdu.
Shubhral

2
Önemli bir not: Bu, kaydırma görünümünün kendisine değil , LinearLayoutiçerisine özellik olarak eklenmelidir ScrollView.
Boris Strandjev

@BorisStrandjev çok önemli not. Cevaba eklenmelidir. Bu arada, bunun için teşekkürler: P
Coreggon

Cevapta kelimenin tam anlamıyla belirtilmiştir.
devmiles.com

35

Düzeninizdeki öğeleri kirletmek yerine, bunu Aktivitenize / Sınıfınıza ekleyebilirsiniz:

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

Bu şekilde, scrollView'unuzun odaklandığı bir öğe değildir, bu, ilk odak noktası olan ve bundan sonra alt görünüme geçen bir konteyner olarak scrollView'unuzdur.


ListView yüksekliğini ScrollView içindeki çocuklara göre ayarlamaya çalıştığımda kısmen işe yarıyor
Konstantin Konopko

Bu yardımcı oldu! (xml'deki aynı öznitelikler çalışmazken ..)
Matan Dahan

Tıkır tıkır çalışıyor! Thx
Bogy

Benim için işe yaradı, ancak şu satırı ekledim: scrollView.fullScroll (ScrollView.FOCUS_UP) Her ikisi de ayrı ayrı çalışmadı.
Juan Giorello

3

Bu kodu deneyebilirsiniz:

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

[N: B] [referans bağlantısı] 1


1
onun iyi bir seçenek ama bence bu yüzden iyi bir kullanıcı deneyimi olmayan açtıktan sonra bir pislik simüle
iBabur

2

Devmiles.com'un söyledikleriyle birlikte.

LinearLayout'unuzda aşağıdaki özelliği ayarlarsanız - android: focusableInTouchMode = "true" LinearLayout'unuz başlangıca odaklanacak ve aktiviteniz alttaki EditText'e kaymayacaktır.

Doğrusal mizanpajınızın altındaki bir görünümde requestLayout () öğesini çağırırsanız, odağı en üstteki görünümünüzden çalabilir. Bu nedenle, daha düşük bir görünümde requestLayout () çağrıldıktan sonra doğrusal düzende en üstteki görünümde requestFocus () 'u çağırın.


1

FullScroll yöntemini kullanmayı denediniz mi? Http: //developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

1

Xamarin Android geliştirme için @Graeme çözümü yapmak istiyorsanız o zaman:

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

1

Sadece onCreate () 'de odaklanılamaz hale getirin

editText.setFocusable(false);

ve kullan

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

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

 ......
 };

ve bir dahaki sefere Edittext'e kaymayacaktır, bir parça veya aktivite oluşturulur.


1

Bu iki satırı ekleyin ScrollView

 android:focusableInTouchMode="true"
 android:descendantFocusability="blocksDescendants"

0

Neden bilmiyorum ama deneyebilirsin

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

Gözlerinde farklı onCreateböyle olmak nereye kaydırmak el için.


0

scrollView.requestFocus(View.FOCUS_UP)üst görünümün görünür olmasını istediğimde sorunumu çözdüm. Yönteme yön parametresini belirtmek requestFocus(int direction), ScrollViewkonumu kontrol etmenin iyi bir yoludur . Daha fazla ayrıntı burada .


0

Benim durumumda ben vardı VideoViewbir iç ConstraintLayoutiçeride a ScrollView. Her VideoViewzaman odak çalıyordu ve bununla ilgili sorunlar var . Çözüm, bir TextureView. Umarım bu birisine yardımcı olur, bana en az bir saate mal olur :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.