wake-up-neo.net

Wie scrollen Sie zum oberen ScrollView-Layout?

Für einen Teil meiner App wird dem Benutzer eine Liste mit Namen angezeigt, und er wird aufgefordert, diese nach Bedarf zu gruppieren. 

(Beachten Sie, der ListView-Code wurde wortwörtlich aus dem Android-Ansichten-Tutorial kopiert. Ich habe ihn noch nicht an meine Bedürfnisse angepasst. Ich versuche nur herauszufinden, wie das funktioniert.)

Das grundlegende Layout ist ein LinearLayout, das eine ScrollView enthält (im folgenden Code "groupsScrollView" genannt), die ein RelativeLayout enthält. Ich habe ein paar Schaltflächen und Text, und darunter meine ListView, die die Liste der Namen anzeigt. Dies alles ist größer als der sichtbare Bildschirmbereich, sodass der Benutzer vertikal scrollen kann, um alles zu sehen.

Dies funktioniert alles wunderbar, außer wenn die Seite geladen wird, wird sie immer an den Anfang meiner ListView gescrollt - in der Mitte der Seite. Der von mir erstellte Text und die Schaltflächen, die dem Benutzer mitteilen, was zu tun ist, sind nicht sichtbar. 

Ich kann den Bildschirm greifen und nach oben scrollen, das funktioniert gut, aber ich möchte, dass der Bildschirm bereits nach oben gescrollt wurde. Der Benutzer sollte nicht nach oben scrollen müssen, um den Anfang einer frisch geladenen Seite zu sehen. Aber alles, was ich versucht habe, programmgesteuert zum oberen Rand des Bildschirms zu scrollen, ist fehlgeschlagen.

Hier ist meine onCreate-Methode:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}

Die Zeile "mainScrollView.pageScroll (View.FOCUS_UP)" ist das Problem. Es verursacht keinen Fehler, scheint aber nichts zu tun. Ich habe scrollTo (0,0), scrollDirection (View.FOCUS_UP) ausprobiert ) und alles andere, woran ich denken kann. 

Da ich keine Fehlermeldung bekomme, muss ich davon ausgehen, dass diese Scroll-Befehle tatsächlich funktionieren, aber sie scrollen zum oberen Rand der ListView und nicht zum oberen Teil des ScrollView oder RelativeLayout, das sie enthält. Dies scheint durch Googles eigene Beschreibung der scrollTo (int x, int y) -Methode bestätigt zu werden, in der sie sagen: "Diese Version klemmt auch das Scrollen an die Grenzen unseres Kindes." 

Um eine lange Frage noch länger zu stellen: Wie lade ich eine Reihe von Ansichten auf den in einer ScrollView enthaltenen Bildschirm und scrolle dann das Ganze programmgesteuert an den Anfang der Seite, damit der Benutzer damit interagieren kann?

Vielen Dank!

143
Glenn

Versuchen 

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

es sollte funktionieren.

237
roomtek

Hatte das gleiche Problem, wahrscheinlich eine Art Fehler. 

Sogar die fullScroll(ScrollView.FOCUS_UP) von der anderen Antwort hat nicht funktioniert .
Das einzige, was für mich funktionierte, war scroll_view.smoothScrollTo(0,0) direkt nachdem der Dialog angezeigt wurde.

162
Mohamed Hafez

ich hatte das gleiche Problem und dieses Problem wurde behoben. Ich hoffe es hilft dir.

listView.setFocusable(false);
92
Miguel Palacios

scrollViewObject.fullScroll(ScrollView.FOCUS_UP) dies funktioniert gut, aber das Problem bei dieser Zeile ist nur, dass, wenn Daten in scrollViewObject gefüllt werden, dieser sofort aufgerufen wurde. Sie müssen einige Millisekunden warten, bis die Daten gefüllt sind. Versuchen Sie diesen Code:

scrollViewObject.postDelayed(new Runnable() {
    @Override
    public void run() {
        scroll.fullScroll(ScrollView.FOCUS_UP);
    }
}, 600);

OR

 scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});
47
Mohammad Imran

Das Hauptproblem aller gültigen Lösungen ist, dass Sie versuchen, die Bildlaufleiste nach oben zu verschieben, wenn sie noch nicht auf dem Bildschirm dargestellt ist.

Sie müssen warten, bis die Bildlaufansicht angezeigt wird, und dann mit einer dieser Lösungen nach oben verschieben. Dies ist eine bessere Lösung als ein Postdelay, da die Verzögerung nicht stört.

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });
32
Pelanes

Sehr leicht

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
27
CommonSenseCode

Ich stand vor demselben Problem Wenn ich Scrollview in View Flipper oder Dialog verwende, gibt scrollViewObject.fullScroll(ScrollView.FOCUS_UP) den Wert false zurück, sodass scrollViewObject.smoothScrollTo(0, 0) für mich bearbeitet wird

Scroll-Fokus oben

23
sravan
 final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 
18
Mladen Rakonjac
runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}
9
traeper

Dies ist ein Bildlauf für scrollview :

            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.scrollTo(0, 0);
                    scrollView.pageScroll(View.FOCUS_UP);
                    scrollView.smoothScrollTo(0,0);
                }
            });
5
Hadi Note

Das ist für mich gearbeitet

scroll_view.smoothScrollTo(0,0); // scroll to top of screen
4
Pankaj Talaviya
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Ready, move up
        scrollView.fullScroll(View.FOCUS_UP);
    }
});
2
user9271802
@SuppressWarnings({ "deprecation", "unchecked" })
public void swipeTopToBottom(AppiumDriver<MobileElement> driver) 
                    throws InterruptedException {
       Dimension dimensions = driver.manage().window().getSize();
        Double screenHeightStart = dimensions.getHeight() * 0.30;
        int scrollStart = screenHeightStart.intValue();
        System.out.println("s="+scrollStart);
        Double screenHeightEnd = dimensions.getHeight()*0.90;
        int scrollEnd = screenHeightEnd.intValue();
        driver.swipe(0,scrollStart,0,scrollEnd,2000);
        CommonUtils.threadWait(driver, 3000);
    }
0
Ajeet Gour