Intereting Posts
Как правильно выравнивать текст в текстовом или Android-тексте Android? Ошибка студии Android Эта библиотека поддержки не должна использовать более низкую версию (19) Конструкция андроида позволяет прокручивать, когда открыта мягкая клавиатура, но не сдвигает ее вверх Android: Как установить допустимые числа и символы в EditText? Android WindowManager TYPE_SYSTEM_ALERT Макет на ощупь TextView lineSpacingMultiplier меньше нуля отбирает последнюю строку Кнопка «Назад» на панели действий Установите цвет фона в навигационном ящике Удаление левого дополнения на Android EditText В чем разница между TypedArray.getInteger () и TypedArray.getInt ()? Образец или лучшая практика для простого приложения-клиента сокета Отправить запрос на веб-службу каждые 5 секунд Обновление Android Studio застряло? Java.lang.NoClassDefFoundError: android.support.v4.view.LayoutInflaterCompat Разбиение макета XML на пользовательский LinearLayout создает избыточное представление LinearLayout

Способы получения позиции просмотра 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> 

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

Solutions Collecting From Web of "Способы получения позиции просмотра 0"

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

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

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

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

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