Как получить конкретные координаты XY положение от линейного макета Android? - PullRequest
2 голосов
/ 16 мая 2011

Я использую приведенный ниже код в xml-файле и программно добавляю дочерние представления с использованием textview, но мне нужно перейти на определенную позицию (предположим, что в каждом textview добавление номера начинается с 1, затем я хочу перейти на 5-е место textview из 10 просмотренных текстов)в представлении с использованием scrollview. Я знал способ прокрутки, но я не знаю, как рассчитать xy-коардинаты из этого макета. Пожалуйста, дайте руководство.

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

4 голосов
/ 15 августа 2011

Я знаю, что это довольно старо, но вот кое-что, что мы видели, работает. Каждое представление имеет 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 голос
/ 16 мая 2011

Если вы пытаетесь использовать View.getTop() в onCreate(), вы получаете 0, потому что представления еще не выложены.Сначала onCreate() завершает свое выполнение, затем Android раскладывает и рисует их, затем ждет пользовательских событий, а затем вы можете получить позиции просмотров.

Я не знаю чистого способа сделать что-то немедленнопосле того, как вся деятельность была изложена (нечистый способ использовать onWindowFocusChanged()).

0 голосов
/ 16 мая 2011

Я голосую за просмотр списка здесь, но другой вариант, который у вас есть, - сохранять каждое текстовое представление в массиве списков при его создании, а затем зацикливать его и находить высоту каждого текстового просмотра, когда вам это необходимо. Затем прокрутите до значения суммы или любого другого значения.

0 голосов
/ 16 мая 2011

Думая из коробки: почему бы не использовать собственный ListView, который точно создан для того, чтобы содержать список представлений и легко получать к ним доступ?

Кроме того, вы пытались запустить этот код в функции onResume вместо функции onCreate?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...