2011-03-23 58 views
1

是否可以將視圖隱藏在屏幕的上邊緣,並且只有在用戶向上滾動時纔會出現?Android:隱藏屏幕上邊緣的視圖

我第一次嘗試使用scrollview,但似乎scrollTo()不工作,除非我使用postDelayed(它甚至不適用於Post())。我試着將它添加到scrollview的view tree觀察者onPreDraw()事件中,除非我延遲它,否則它不起作用,所以當活動首次啓動時會出現一個醜陋的故障。

第二個問題是,如果屏幕鍵盤被最小化,視圖不再需要滾動,因此使用滾動偏移隱藏事物不再有效。我考慮過在代碼中操縱高度,但這看起來很駭人。

有沒有更好的方法來做到這一點比使用scrollview?或者,有沒有人有最好的地方放置scrollTo(onCreate結束不工作,我試過的其他地方)的任何提示,所以我不需要使用postDelayed?這至少會消除一個小故障。

謝謝!

這是我現在正在使用的代碼,這是最不起眼的,但我不明白爲什麼它不會工作,直到第三次onPreDraw()被調用。

mScrollView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() 
    { 
     @Override 
     public boolean onPreDraw() 
     { 
      final int fieldYStart = mFieldIWantAtTheTop.getTop(); 

      if (mFieldIWantAtTheTopYStart != fieldYStart 
      || mScrollView.getScrollY() < 10) 
      { 
       mFieldIWantAtTheTopYStart = fieldYStart; 

       mScrollView.post(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         Log.v("Testing", "scrolling!"); 
         mScrollView.scrollTo(0, mFieldIWantAtTheTopYStart); 
         Log.v("Testing", "scroll is now=" + mScrollView.getScrollY()); 
        } 
       }); 
      } 


      return true; 
     } 
    }); 

我還使用自定義的滾動視圖下面所提到的,但這並沒有解決圖形毛刺問題的嘗試:

@Override 
public void onMeasure(int measureWidthSpec, int measureHeightSpec) { 
    super.onMeasure(measureWidthSpec, measureHeightSpec); 
    Log.v("Testing", "Scrolling"); 
    post(
      new Runnable() 
      { 
       public void run() 
       { 
        scrollTo(0, 100); 
        Log.v("Testing", "ScrollY = " + getScrollY()); 
       } 
      });  
} 

此代碼的工作一樣上面的onPreDraw()的代碼,但有仍然是在活動啓動,因爲活動是與滾動爲0

回答

1

我沒試過先畫一個小故障,但您可能希望創建一個自定義滾動型和重載onMeasure

ScrollView scroll = new ScrollView(this) { 
    @Override 
    public void onMeasure(int measureWidthSpec, int measureHeightSpec) { 
     super.onMeasure(measureWidthSpec, measureHeightSpec); 
     scrollTo(...); 
    } 
}; 

看起來這應該是scrollTo有效的最早點。

編輯 - 我發現this answer,這顯然是爲提問者工作。這是你嘗試的方法嗎?

+0

是的,基本上,您必須等到第一個佈局傳遞完成後再滾動ScrollView。 – 2011-03-23 22:19:33

+0

(提前命中輸入) – Kevin 2011-03-23 22:19:53

+0

Re:鏈接:這工作(我不明白爲什麼,因爲scrollTo()不起作用),但即使我使用post()也有明顯的故障。現在我正在使用onPreDraw(),滾動實際上只能在第三個調用中工作(我在scrollTo調用後立即用getScrollY檢查,直到onPreDraw()#3才工作,但在這種情況下仍然存在一個小故障)。 – Kevin 2011-03-23 22:20:59