Intereting Posts
Контроль количества элементов списка ListView в Android Studio Выбираемое круговое изображение, такое как Google+ Разрешение Android 6.0 (Marshmallow) READ_CONTACTS позволяет читать имя контакта, когда разрешение отклонено Как создавать приложения для Android только для Enterprise Android BluetoothSocket – Сроки Android Browser – Javascript window.innerWidth возвращает неправильное значение WebView и GridView в ScrollView, просмотр слишком велик, чтобы вписаться в кеш рисования Внутри проекта Eclipse Android запускаются классы Java с основными (String args), поскольку приложение Java вызывает «Недопустимый макет java.lang.String at value» Основы. Отправка сигнала с внешнего устройства, подключенного через порт USB, на Android-телефон, чтобы сделать обычное приложение. Активность PopUp начинается снова, когда она запускается из "последних приложений" Общие настройки Android Настроить фокус большого пальца и нажимать на пользовательскую панель поиска программно Дата изменения имени Google не дает неправильного времени Android – Использование шаблона Dao с contentProvider Как подключиться к компьютеру без публичного IP?

Способы получения позиции просмотра 0

Этот вопрос задавали несколько раз, но каждый дает причину, почему это происходит (т. Е. Расчет происходит до того, как макет заложен). Но мне нужно решение для этого. Я попробовал getBottom(); , getTop(); , getLocationOnScreen(int[] location); , Но все возвращает значение Zero (0). Я даже пытался дать их в onStart(); , Чтобы дать время для компоновки, но не повезло. Вот мой код:

 TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.textView1); Log.d("getBottom :", Integer.toString(tv.getBottom())); Log.d("gettop :", Integer.toString(tv.getTop())); int[] location = new int[2]; tv.getLocationOnScreen(location); Log.d("getlocationonscreen values :", Integer.toString(location[0])+" "+Integer.toString(location[1])); } @Override protected void onStart() { Log.d("getBottom in onStart :", Integer.toString(tv.getBottom())); Log.d("gettop in onStart :", Integer.toString(tv.getTop())); int[] location = new int[2]; tv.getLocationOnScreen(location); Log.d("getlocationonscreen in onStart :", Integer.toString(location[0])+" "+Integer.toString(location[1])); super.onStart(); } 

Макет XML:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="156dp" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </RelativeLayout> 

Опять же, я прошу прощения за повторение вопроса. Заранее спасибо.

Вы помещаете «измерение» в метод onWindowFocusChanged() .
Как указано в документации:

Это лучший показатель того, является ли это действие видимым для пользователя.

Вы также можете поместить его в onResume() который является последним шагом до того, как приложение будет полностью на экране и активным, однако:

Имейте в виду, что onResume не лучший индикатор того, что ваша активность видна пользователю; Системное окно, такое как блокировка клавиатуры, может быть впереди. Используйте onWindowFocusChanged (boolean), чтобы точно знать, что ваша активность видна пользователю (например, для возобновления игры).

Если окно / представление еще не отображается, нет гарантии, что он имеет свои измерения, поэтому предыдущий метод был бы лучше.