2011-05-16 73 views
2

Iam在xml文件中使用下面的代码,并通过使用textview编程添加子视图,但我需要去特定的位置(假设在每个文本视图IAM添加数字从1开始,然后我想要从总共10个文字浏览第5个位置textview)使用scrollview的视图。我知道滚动的方法,但我不知道如何计算xy cooardinates从这个layout.Please指导。如何从线性布局获取特定位置的xy坐标android?

<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> 

Suppost我的代码是这样的

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

我知道这有点古怪,但这里有一些我们已经看到的工作。每个视图都有一个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) 
     } 
    }); 
    } 
} 
0

思考开箱:为什么不利用这恰恰是由包含的视图列表,轻松地访问这些定制的ListView?

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

1

如果您尝试在onCreate()中使用View.getTop(),您将获得0,因为视图尚未布置。首先onCreate()结束其执行,然后Android将事物绘制出来并绘制它们,然后等待用户事件,然后您可以获取观看位置。

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

+0

我试过所有上述方法,但它仍然给坐标0,0 – ADIT 2011-05-17 05:36:52

+1

@ADIT:哪个上面的方法? getTop()和getLeft()将返回0,直到布局为止。看到这个问题:http://stackoverflow.com/questions/3947145/what-event-is-fired-after-all-views-are-fully-drawn – bigstones 2011-05-17 10:17:27

0

我为listview在这里投票,但你有另一个选项是当你创建他们,然后循环它,并找到每个文本视图的高度,当你需要时,每个textview存储在一个数组列表。然后滚动到总和的值或任何您的计算。