如何从Linear Layout android获取特定位置xy坐标?

时间:2011-05-16 13:02:05

标签: android scrollview

我在xml文件中使用下面的代码并使用textview以编程方式添加子视图但我需要去特定的位置(假设在每个textview中我添加数字从1开始然后我想从总共10个textviews到第5个位置textview)在使用scrollview的视图上。我知道滚动的方法,但我不知道如何从这个布局计算xy cooardinates。请给出指导。

<ScrollView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:scrollbars="vertical"
        android:id="@+id/agenda_scroll"
        >
        <LinearLayout android:id="@+id/inner_layout"
            android:orientation="vertical" android:layout_width="fill_parent"
            android:layout_height="fill_parent">

        </LinearLayout>
    </ScrollView>

支持我的代码就像这样

ScrollView scview = (ScrollView)findViewById(R.id.Scl);
LinearLayout eventLayout = (LinearLayout) findViewById(R.id.inner_layout);
TextView txtView = new TextView(cx);
txtView.setText("1");
eventLayout.addView(txtview);
TextView txtView = new TextView(cx);
txtView.setText("2");
eventLayout.addView(txtview);
TextView txtView = new TextView(cx);
txtView.setText("3");
eventLayout.addView(txtview);
TextView txtView = new TextView(cx);
txtView.setText("4");
eventLayout.addView(txtview);
TextView txtView = new TextView(cx);
txtView.setText("5");

int y = txtview.getTop();
Log.d(TAG,"YAxis"+y);//returning 0


eventLayout.addView(txtview);
TextView txtView = new TextView(cx);
txtView.setText("6");
eventLayout.addView(txtview);
.........

scview .scrollTo(0,y);///here positions giving (0,0)

4 个答案:

答案 0 :(得分:4)

我知道这有点旧,但这是我们见过的工作。每个视图都有ViewTreeObserver,可用于观察视图及其层次结构。获取ViewTreeObserver并按如下方式监听布局更改。一旦布局了视图及其层次结构,您就可以执行基于大小和位置的查询。

onCreate(){
  //Code

  eventLayout.addView(txtview);
  TextView txtView = new TextView(cx);
  txtView.setText("6");
  eventLayout.addView(txtview)

  //More code

  //Observe for a layout change
  ViewTreeObserver viewTreeObserver = eventLayout.getViewTreeObserver();
  if (viewTreeObserver.isAlive()) {
    viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        //View and it's hierarchy laid out, perform your operations
        scview .scrollTo(0,y);///here positions giving (0,0)
      }
    });
  }
}

答案 1 :(得分:1)

如果您尝试在View.getTop()中使用onCreate(),那么您将获得0,因为视图尚未布局。首先onCreate()结束执行,然后安排事物并绘制它们,然后它等待用户事件,然后你就可以获得视图位置。

我不知道在整个活动布局之后立即做一些干净的事情(一种不干净的方式是使用onWindowFocusChanged())。

答案 2 :(得分:0)

开箱即用:为什么不使用自定义ListView,它精确地包含视图列表并轻松访问它们?

另外,您是否尝试在onResume函数中运行此代码而不是onCreate函数?

答案 3 :(得分:0)

我在这里投票给listview,但你有另一个选择是在创建它们时将每个textview存储在一个arraylist中,然后循环它并在需要时找到每个textview的高度。然后滚动到总和的值或计算的任何值。