2013-11-27 3 views
1

Я добавляю 10 текстовых изображений в линейном макете. и я получаю все координаты всего текста. Я использую ниже код.получить координату массива textview во время выполнения в android

public class MainActivity extends Activity 
{ 
    TextView t[] = new TextView[10];; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
{ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     LinearLayout linear = (LinearLayout) findViewById(R.id.linear); 
     for(int i=0;i<10;i++) 
     { 
      t[i] = new TextView(this); 
      t[i].setTag(i); 
      String s = "Hello : "+i; 
      t[i].setText(s); 
      linear.addView(t[i]); 
     } 
     for(int i=0;i<10;i++) 
     { 
      float x0 = t[i].getX(); 
      float y0 = t[i].getY(); 
      float y1 = t[i].getWidth(); 
      float x1 = x0 + t[i].getHeight(); 


      Log.d(""+i, "x0 : "+x0 +" y0 : "+y0); 
      Log.d(""+i, "x0 : "+x0 +" y1 : "+y1); 
      Log.d(""+i, "x1 : "+x1 +" y0 : "+y0); 
      Log.d(""+i, "x1 : "+x1 +" y1 : "+y1); 
     } 
} 

Весь текст отображается на экране. Но я все равно 0. Что не так в этом коде?

ответ

1

Проблема заключается в том, что LinearLayout еще не прошел через Мера и Макет. Он содержит эти объекты, но сейчас они «ничего».

Дать работоспособной в LinearLayout и делать то же самое:

linear.post(new Runnable()) { 
    // The view is now visible. Retrieve the objects and check. 
} 
1

Возможно, вы захотите получить координаты текстовых представлений после того, как LinearLayout изменило выполнение измерений и компоновки дочерних представлений.

Обратите внимание на событие onLayout и проверьте его координаты.

0

после setContentView она занимает некоторое время, прежде чем точка зрения фактически рисуется на экране. Вы делаете это immedeately и, следовательно, взгляды еще не там ... Подождите, LinearLayout быть обращено так:

/** Replace your 2nd loop, with the code below*/ 
linear.addOnLayoutChangeListener(new OnLayoutChangeListener() { 

    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

     for (int i = 0; i < 10; i++) { 
      float x0 = t[i].getX(); 
      float y0 = t[i].getY(); 
      float y1 = t[i].getWidth(); 
      float x1 = x0 + t[i].getHeight(); 

      Log.d("" + i, "x0 : " + x0 + " y0 : " + y0); 
      Log.d("" + i, "x0 : " + x0 + " y1 : " + y1); 
      Log.d("" + i, "x1 : " + x1 + " y0 : " + y0); 
      Log.d("" + i, "x1 : " + x1 + " y1 : " + y1); 
     } 

    } 
}); 
0

Когда вам нужно «освежить» свой макет, его называют Invalidate. Только назовите его в потоке пользовательского интерфейса. Если вы вызываете его в другом потоке (скажем, таймер), тогда вызывайте postInvalidate.

Вам нужно подождать, пока макет будет измеряться. Напишите runnable после того, как скажем через 5 секунд после циклов for.

new Timer().schedule(new TimerTask(){ 
    public void run() { 
     //do something here 
    } 
}, 2000); //delay of 2 seconds 

или использовать обработчик: -

Вы можете использовать обработчик, который каким-то образом действует как таймер

Handler delay = new Handler(); 
delay.postDelayed(mUpdateTimeTask, 2000);//time in milliseconds 

И называет это:

private Runnable mUpdateTimeTask = new Runnable() 
{ public void run() 
    { // Todo 

     // This line is necessary for the next call 
     delay.postDelayed(this, 100); 
    } 
} 
Смежные вопросы