web-dev-qa-db-ja.com

長いScrollViewレイアウトの一番上にスクロールする方法は?

私のアプリの一部として、ユーザーには名前のリストが表示され、適切と思われるグループ化するように求められます。

(注、ListViewコードはAndroid Viewsチュートリアルから逐語的にコピーされました。私はまだ自分のニーズに合わせてカスタマイズしていません。この作業を行う方法を見つけようとしています。)

基本的なレイアウトは、RelativeLayoutを含むScrollView(以下のコードでは「groupsScrollView」と呼ばれます)を含むLinearLayoutです。ボタンとテキストがいくつかあり、その下にリストビューがあり、名前のリストが表示されます。これはすべて表示画面領域よりも高いため、ユーザーはすべてを見るために垂直にスクロールできます。

これはすべて、ページが読み込まれるとき、リストビューの上部(ページの中央)に常に事前スクロールされることを除いて、すべて正常に機能します。ユーザーに何をすべきかを伝えるために作成したテキストとボタンは表示されません。

画面をつかんで上にスクロールすることもできますが、それはうまく機能しますが、画面が既に一番上までスクロールされた状態でロードしたいのです。ユーザーは、新しくロードされたページの上部を見るために上にスクロールする必要はありません。しかし、プログラムで画面の一番上までスクロールしようとしたすべてが失敗しました。

これが私のonCreateメソッドです:

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();
        }
      });
}

「mainScrollView.pageScroll(View.FOCUS_UP);」という行が問題です。エラーは発生しませんが、何もしないようです。scrollTo(0,0)、scrollDirection(View.FOCUS_UPを試しました。 )、および私が考えることができる他のすべて。

エラーが発生しないため、これらのスクロールコマンドが実際に機能していると仮定する必要がありますが、スクロールビューまたはそれを含むRelativeLayoutの上部ではなく、リストビューの上部にスクロールしていると仮定する必要があります。これはscrollTo(int x、int y)メソッドのGoogle自身の説明で確認されているようで、「このバージョンはスクロールを子供の境界に固定します」と言っています。

長い質問をさらに長くするために、ScrollViewに含まれる画面に多数のビューを読み込み、ユーザーが操作できるようにプログラムでページ全体をスクロールする方法を教えてください。

ありがとう!

150
Glenn

試してみる

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

動作するはずです。

243
roomtek

同じ問題、おそらく何らかのバグがありました。

他の回答のfullScroll(ScrollView.FOCUS_UP)でも機能しませんでした。
ダイアログが表示された直後に、私のために働いたのはscroll_view.smoothScrollTo(0,0)を呼び出すことだけでした。

168
Mohamed Hafez

私は同じ問題を抱えていたので、修正しました。お役に立てば幸いです。

listView.setFocusable(false);
95
Miguel Palacios

scrollViewObject.fullScroll(ScrollView.FOCUS_UP)これは正常に機能しますが、この行の問題は、データがscrollViewObjectに入力されるとすぐに呼び出されることです。データが入力されるまで数ミリ秒待機する必要があります。このコードを試してください:

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);
    }
});
49
Mohammad Imran

これらすべての有効なソリューションの主な問題は、まだ画面に描画されていないスクロールを上に移動しようとしていることです。

スクロールビューが画面に表示されるまで待ってから、これらのソリューションのいずれかで上に移動する必要があります。遅延を気にしないので、これは後遅延よりも優れたソリューションです。

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

非常に簡単

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

View FlipperまたはDialog内でScrollviewを使用しているときに、scrollViewObject.fullScroll(ScrollView.FOCUS_UP)がfalseを返すので、scrollViewObject.smoothScrollTo(0, 0)が機能しているという同じ問題に直面しました

スクロールフォーカストップ

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

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

これは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

これは私のために働いています

scroll_view.smoothScrollTo(0,0); // scroll to top of screen
5
Pankaj Talaviya
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Ready, move up
        scrollView.fullScroll(View.FOCUS_UP);
    }
});
3
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