8833


例えば以下のようにしてXMLで定義されたView(`content`)があります｡そこに子Viewとして`contentItem`を8個追加します｡

[code]

    final LinearLayout content = (LinearLayout)view.findViewById(R.id.content_list);
    for(int i=0; i<8; i++){
      LinearLayout contentItem = (LinearLayout) inflater.inflate(R.layout.general_item, null);
      content.addView(contentItem);
    }
    
[/code]

これのそれぞれの､Viewつまり､`content`の子View(`contentItem`)の位置を取得する方法を知りたいです｡  
`onViewCreated`で以下のように`getLocationInWindow`を使ったのですが､すべての値が0のなってしまいました｡

[code]

        private final int[] viewPosition = new int[8];
        @Override
        public void onViewCreated(View view, Bundle bundle){
            LinearLayout content = (LinearLayout)view.findViewById(R.id.content_list);
            for(int i=0; i<8; i++){
                final int [] anchorPos = new int[2];
                View contentView = content.getChildAt(i);
                contentView.getLocationInWindow(anchorPos);
                viewPosition[i] = anchorPos[1];
            }
        }
    
[/code]

他になにか方法はありますか? もしあれば教えて下さい｡ よろしくおねがいします｡

**追記:**

何をやりたいのかというと､<http://doruby.kbmj.com/daoka_tips/20120417>/Android_ScrollView_このサイトに書かれている､`ObservableScrollView`というものを使うとScrollViewの位置がわかるようなので､Viewの位置を調べて､その位置で特定の処理を行うということをしたいです｡


CC BY-SA 3.0
2015-04-04T01:27:26.663
8740
2015-04-06T14:40:08.597
2015-04-05T02:46:24.463
49
7232
question
android android-layout
【Android】動的に追加したViewの位置を取得したい｡


`LinearLayout`の`indexOfChild(View)`でしょうか？

<http://developer.android.com/intl/ja/reference/android/view/ViewGroup.html#indexOfChild(android.view.View)>

追記

レイアウト位置を知りたいということだったので、子Viewの`onLayout()`を拾うというのはどうでしょうか？

<http://developer.android.com/intl/ja/reference/android/view/View.html#onLayout(boolean>,
int, int, int, int)


CC BY-SA 3.0
2015-04-04T03:21:09.623
8744
2015-04-04T10:57:36.590
2015-04-04T10:57:36.590
845
845
8740
answer


`getLocationInWindow`を使いたいのでしたら、そのコードでは動きません。  
というのも、`onViewCreated`の段階では、レイアウト計算が終わっていないためです。

レイアウト計算が終わった後、改めて取得する必要があります。レイアウト計算の終了通知は  
`addOnGlobalLayoutListener`で受け取れます。そのとき取得すれば、値がとれます。

このリスナは、レイアウト計算が終了したらいつでも呼ばれますので、不要になったら`removeOnGlobalLayoutListener`で、削除するとよいでしょう。

御武運を。


CC BY-SA 3.0
2015-04-06T14:40:08.597
8833
2015-04-06T14:40:08.597
9191
8740
answer