2012-03-13 9 views
62

Ilekroć uruchamiam tę czynność, zawsze rozpoczyna się ona od dołu - przewijana do samego dołu. Nie robię nic dziwnego w działaniu OnCreate (lub nigdzie w tej sprawie), że spodziewam się zmienić pozycję przewijania. Próbowałem ustawić ostrość na najwyższą możliwą do ustawienia regulację i metodę scrollto, ale żadna z nich nie działa. Poza tym żadne z moich innych działań nie ma tego problemu. Oto układ:Dlaczego moja aktywność Androida jest zawsze przewijana na dół?

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

Jak dokładnie próbowałeś zmienić ostrość? –

+1

przy użyciu metody fulscroll opisanej poniżej i metody scrollto, jak również opisano poniżej. Niekoniecznie zastanawiam się nad naprawieniem tego w ten sposób, ale musi istnieć powód, dla którego tak się zaczyna i wolę to naprawić, poprawiając to. – MrGibbage

Odpowiedz

236

Kiedy Android rozpoczyna działalność, pewną kontrolę musi się skupić. Kiedy nie ma wyznaczonej kontroli, aby skoncentrować się, system wybiera pierwszą uprawnioną kontrolę, która chce się skupić. Jeśli ustawisz następującą właściwość w swoim LinearLayout - android:focusableInTouchMode="true", Twoja LinearLayout będzie koncentrować się na starcie, a twoja aktywność nie zostanie przewinięta do dolnej krawędzi na EditText.

+0

Nie działa w moim GridLayout. Mam GridView na środku układu i za każdym razem uzyskuje on ostrość. – Iqbal

+0

dlaczego to nie działa z 'focusable = true'? –

+0

Podrapałam się w głowę przez cały dzień i nie mogłam znaleźć przyczyny tego, co dzieje się w jednej konkretnej czynności, a wciąż nie rozumiem, ponieważ nie włączałem żadnego widoku. Ale dzięki tobie udało mi się rozwiązać ten problem. Byłoby wspaniale, gdyby ktoś mógł rzucić trochę światła na to, co może być przyczyną, ponieważ nie ma nic nowego, co robię w nowej działalności. – Shubhral

0

Nie wiem dlaczego, ale można eksperymentować z

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

w onCreate ręcznie przewinąć go do miejsca, gdzie chcesz go mieć.

+0

Dokładnie tego próbowałem, ale nie działało. – MrGibbage

1

Czy próbowałeś użytkowania fullScroll metoda http: //developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP); 
+1

Próbowałem tego. To nie zadziałało. – MrGibbage

2

Można spróbować ten kod:

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

[N: B] [link Referance] 1

+1

to dobra opcja, ale symuluje szarpnięcie po otwarciu, więc nie jest to dobre doświadczenie dla użytkownika, myślę, że – iBabur

1

Wraz z tym, co devmiles.com powiedział.

Jeśli ustawisz następującą właściwość w swoim LinearLayout - Android: focusableInTouchMode = „true” Twój LinearLayout skupi się na starcie i Twoja aktywność nie będzie przewijać do EditText w dole.

Jeśli wywołasz requestLayout() w widoku u dołu układu liniowego, może on ukradł fokus z twojego najwyższego widoku. Po prostu wywołaj funkcję requestFocus() w najwyższym widoku w układzie liniowym po wywołaniu metody requestLayout() w dolnym widoku.

22

Zamiast zanieczyszczających elementów w układzie, można dodać to do swojej działalności/klasy:

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

ten sposób, że nie jest to element w swoim Scrollview uzyskiwanie ostrości, to twoja Scrollview jako kontener, który najpierw zorientuj się, przechodząc do widoku dziecka po tym.

+0

dziękuję, że to było jedyne, które zadziałało dla mnie – commonSenseCode

+0

Częściowo działa dla mnie, gdy próbuję ustawić wysokość listy w oparciu o dzieci wewnątrz ScrollView –

+0

To pomógł! (podczas gdy te same atrybuty w xml nie działały ...) –

0

Dla rozwoju Xamarin Android, jeśli chcesz zrobić rozwiązanie @Graeme następnie:

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

Tylko nie aktywowana w onCreate()

editText.setFocusable(false); 

i używać

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

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

...... 
}; 

i następnym razem nie zostanie przewinięty do edytora Edittext, zostanie utworzony fragment lub działanie.

Powiązane problemy