21

私はこれに少し行き詰まっています-何よりもまず、次のリンクは役に立ちましたが、可視性に関する少しの問題を思いつきました:

リンク:ビューの可視性を確認する

スクロール ビュー (親) といくつかのサブビュー ( LinearLayout-> TableLayout) などがありView.GONEます。XML ( android:visibility="gone") 内に設定する項目がいくつかあります。

表示されているかどうかを判断するための簡単なコードがありますがgetVisibility()、アイテムをに設定しView.VISIBLEてすぐgetDrawingRect()に試してみると、全面的にゼロの Rect が得られます。さらにクリックすると、正しい座標が取得されます。

これは、(XML で定義されているように) ビューが一度も描画されていないために、座標が返されないことが原因である可能性がありますが、View.VISIBLE画面の可視性を判断する前に設定します。onDraw() などから何らかのコールバックを取得する必要があるのでしょうか? または、コード内の非表示アイテムのビューの可視性を設定することもできます。ちょっと面倒です;(

いくつかのコード:

Rect scrollBounds = new Rect();
scroll.getHitRect(scrollBounds);

Rect viewBounds = new Rect();

if (view.getVisibility() == View.GONE) {
    view.setVisibility(View.VISBLE)


    viewBounds.getDrawingRect(viewBounds);
    if (!Rect.intersects(scrollBounds, viewBounds) {
        // do somthing
    } 
}

レイアウト領域は次のとおりです。

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

もちろん、これについて完全に間違った方法で行っている可能性が非常に高いです。基本的には、表示されたビュー全体が見えるように、スクロールビューが自分自身を配置するようにしたいだけです。

他の情報が必要な場合は、お知らせください。

4

2 に答える 2

20

正しい方向に向けてくれたOceanLifeに感謝します!確かにコールバックが必要で、ViewTreeObserver.OnGlobalLayoutListener()うまくいきました。最終的にフラグメント クラスに対してリスナーを実装し、必要な場所でそれを取得しました。複数の呼び出しに関する警告もありがとうございますremoveOnGlobalLayoutListener()。メソッドを使用してこれを解決しました-魅力的です。

コード:

...

// vto initialised in my onCreateView() method

vto = getView().getViewTreeObserver();
vto.addOnGlobalLayoutListener(this);

...

@Override
    public void onGlobalLayout() {

        final int i[] = new int[2];
        final Rect scrollBounds = new Rect();

        sView.getHitRect(scrollBounds);
        tempView.getLocationOnScreen(i);

        if (i[1] >= scrollBounds.bottom) {
            sView.post(new Runnable() {
                @Override
                public void run() {
                    sView.smoothScrollTo(0, sView.getScrollY() + (i[1] - scrollBounds.bottom));
                }
            });
        }

        vto.removeOnGlobalLayoutListener(this);
    }

今のうちに大掃除しなきゃ…

于 2013-04-08T19:02:02.987 に答える
11

したがって、私がこれを正しく読んでいる場合、あなたが抱えている問題は、レイアウト内のいくつかのビューの寸法を調べて、親との交差があるかどうかを調べたいということですScrollView

(ほのめかしたように)あなたが見ていると思うのは、ディスパッチされているビューを描画する命令であり、その後、ある種の競合状態で、レイアウトの測定値を解決するレンダラー、ビューオブジェクトが実際のサイズを取得する実際のレンダリングです。 . ビューが画面上でどのようなサイズを持っているかを調べる 1 つの方法は、レイアウト ツリー リスナーを使用することです。このオブザーバーを使用して、ピクセルの幅と高さを定義する必要がある Google Charts API を利用するときに画面の寸法を解決します... もちろん、これはおそらく開発者が直面する最大の問題です。だから観察してください(しゃれが意図されています)。

final ViewTreeObserver vto = chart.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

  /**
   * @see android.view.ViewTreeObserver.OnGlobalLayoutListener#onGlobalLayout()
   */
  @SuppressWarnings("deprecation")
  @Override
  public void onGlobalLayout() {
    if (view.getVisibility() == View.GONE) {
      view.setVisibility(View.VISBLE)
      viewBounds.getDrawingRect(viewBounds);
      if (!Rect.intersects(scrollBounds, viewBounds) {
        // do something
      } 
    }
  }
});

onGlobalLayoutレンダラーが最終的なソリューションに近づくにつれて、 が複数回呼び出されるという警告の言葉。最後の電話は私たちが取るものです。

これにより、ビュー コンポーネントの幅と高さを取得するなど、描画されたビューでアクションを実行するためのメカニズムが提供されます。それがあなたを助けることを願っています。

余談ですが、Square の賢明な担当者が FEST hamcrest ライブラリを設計しました。このライブラリを使用すると、Robotium と一緒にテストを作成できます。それをチェックしてください

于 2013-04-08T09:41:37.660 に答える