В чем заключается ошибка в поисках координат view?

Друже, выручайте, ей богу 3тий день колочусь , ничего не могу понять. В кратце. Нужно узнать x,y кнопок на Лаяуте, проблема в том, что выдает 0.0. Но, я бы мог подумать, что нерабочий метод и т.д, но самое интересное это то, что скопировав данный метод и применив на другую активность - все работает. Скоро сдавать работу, не имею малейшего понятия куда двигаться. Новичок в Android. Выручайте, братцы, кто чем может. Код активности, где не работает :

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_graps_);
    Intent intent = getIntent();
    String textWindowS = intent.getStringExtra("editTextS");
    visibleGraph(textWindowS);
    drawGraph();
}

private void visibleGraph(String textWindows) {
    ......
        }

    }
}

private void drawGraph() {
    Button btA = (Button) findViewById(R.id.bt_A);
    Button btB = (Button) findViewById(R.id.bt_B);
    Button btC = (Button) findViewById(R.id.bt_C);
    Button btD = (Button) findViewById(R.id.bt_D);
    Button btE = (Button) findViewById(R.id.bt_E);
    Button btF = (Button) findViewById(R.id.bt_F);
    Button btG = (Button) findViewById(R.id.bt_G);
    Button btH = (Button) findViewById(R.id.bt_H);
    Button btJ = (Button) findViewById(R.id.bt_J);
    Button btK = (Button) findViewById(R.id.bt_K);
    Button btL = (Button) findViewById(R.id.bt_L);
    Button btM = (Button) findViewById(R.id.bt_M);
    Button btN = (Button) findViewById(R.id.bt_N);
    Button btO = (Button) findViewById(R.id.bt_O);
    drawingImageView = this.findViewById(R.id.drawingImageView);
    Bitmap bitmap = Bitmap.createBitmap((int) getWindowManager()
           .getDefaultDisplay().getWidth(), (int) getWindowManager()
           .getDefaultDisplay().getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
   drawingImageView.setImageBitmap(bitmap);

    Paint paint = new Paint();
    paint.setColor(Color.DKGRAY);
    paint.setStrokeWidth(3);

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);


  //  canvas.drawLine(x1, y1, 100, 100, paint);

     //
     // вот тут отправляется view в метод, где должны определиться координаты, но возвращается всегда 0
    Point point = getCenterPointOfView(btA);
    System.out.println(point.x + " " + point.y);


}

private Point getCenterPointOfView(View view) {
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    int x = location[0] + view.getWidth() / 2;
    int y = location[1] + view.getHeight() / 2;
    return new Point(x, y);
}

А вот точно такой же Активити, решил я попробывать туда вставить точно такую же операцию, результат - верный.

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void continue_bt (View view){
    EditText editText = (EditText) findViewById(R.id.mainWindowText);
    String editTextS = editText.getText().toString();
   // тут отправляю view в метод и результат - верный
    Point point = getCenterPointOfView(editText);
    System.out.println(point.x + " " + point.y);
    Intent intent = new Intent(this,Graps_Activity.class);
    intent.putExtra("editTextS",editTextS);
    startActivity(intent);

}
private Point getCenterPointOfView(View view) {
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    int x = location[0] + view.getWidth() / 2;
    int y = location[1] + view.getHeight() / 2;
    return new Point(x, y);
}

}

введите сюда описание изображения


Ответы (1 шт):

Автор решения: igo

Если вам нужно получить координаты View элемента, то это рано делать в методе onCreate(). Для этого можно использовать ViewTreeObserver. Это такой колбэк который срабатывает когда view уже имеет конкретные координаты.

Например:

    ViewTreeObserver vto = view.getViewTreeObserver(); // view для которого будут определены координаты 

    vto.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            int x  = (int) view.getX();
            int y = (int) view.getY();
            Log.d("log", "X view: " + x);
            Log.d("log", "Y view: " + y);

        }
    });
→ Ссылка