Если я вызываю getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0
31622 просмотра
7 ответа
Если я вызываю getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0. Я думаю, что это представление еще не нарисовано в данный момент.
Также я думаю, что мне нужно поместить getMeasuredWidth () или getWidth () в метод обратного вызова, вызываемый после отрисовки компоновки и известных измерений вида. Какой метод обратного вызова Android я должен использовать?
Автор: mobiledev Alex Источник Размещён: 13.11.2019 11:30Ответы (7)
78 плюса
Вы не можете использовать width
/ height
/ getMeasuredWidth
/ getMeasuredHeight
на a View
до того, как система отобразит его (обычно из onCreate
/ onResume
).
Простым решением для этого является размещение Runnable
в макете. Runnable будет выполнен после того, View
как был выложен.
BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout);
BoxesLayout.post(new Runnable() {
@Override
public void run() {
int w = BoxesLayout.getMeasuredWidth();
int h = BoxesLayout.getMeasuredHeight();
...
}
});
Автор: Adorjan Princz
Размещён: 20.01.2013 02:27
37 плюса
Этот ответ говорит:
Используйте ViewTreeObserver
на View
ожидания первого макета. Только после первого макета будет getWidth()/getHeight()/getMeasuredWidth()/getMeasuredHeight()
работать.
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
viewWidth = mediaGallery.getWidth();
viewHeight = mediaGallery.getHeight();
}
});
}
Автор: Jeff Axelrod
Размещён: 29.07.2012 03:28
5 плюса
вы можете переопределить onLayout () в вашем представлении; это используется android для позиционирования каждого из дочерних элементов представления, так что вы можете делать то, что вы хотите сделать там после super(..)
вызова.
4 плюса
Действительно, похоже, что если макет не отображается на экране, метод getWidth () возвращает 0. Для меня, по-видимому, работает вызов метода measure () перед вызовом getMeasuredWidth () или getMesuredHeight (). Для метода меры я использовал аргументы Layout.WRAP_CONTENT, чтобы получить измерение того, что содержит макет.
Надеюсь, это поможет, Михай
Автор: r1k0 Размещён: 13.02.2012 10:583 плюса
Более простой способ:
view.post(new Runnable() {
public void run() {
view.getWidth();
}
}
);
http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)
Автор: Wonson Размещён: 28.07.2015 01:551 плюс
Решение № 1: Чтобы сделать это динамически, вам нужен тег. Тег - это, по сути, способ представления воспоминаний. Поэтому сохраните convertView в другом классе (MyTag). Итак, внутри вашего Java-файла:
private LayoutInflater layoutInflater;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyTag holder = null;
View row = convertView;
if (row == null) {
//Inflate the view however u can
String strInflater = Context.LAYOUT_INFLATER_SERVICE;
layoutInflater = (LayoutInflater) context.getSystemService(strInflater);
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResID, parent, false);
holder = new MyTag();
holder.itemName = (TextView) row.findViewById(R.id.example_itemname);
holder.icon = (ImageView) row.findViewById(R.id.example_image);
holder.button1 = (Button) row.findViewById(R.id.swipe_button1);
holder.button2 = (Button) row.findViewById(R.id.swipe_button2);
holder.button3 = (Button) row.findViewById(R.id.swipe_button3);
row.setTag(holder);
} else {
holder = (MyTag) row.getTag();
}
holder.itemName.setText(itemdata.getItemName());
System.out.println("holder.button3.getMeasuredWidth()= "+ holder.button3.getMeasuredWidth());
System.out.println("holder.button3.getWidth()= "+ holder.button3.getWidth());
return row;
} //End of getView()
static class MyTag { //It also works if not static
TextView itemName;
ImageView icon;
Button button1;
Button button2;
Button button3;
}
Решение № 2: Жесткий код Предварительно установите ширину. Внутри вашего файла res / values / dimensions.xml включите
<dimen name="your_button_width">50dp</dimen>
Затем в вашем файле res / layout / your_layout.xml включите
<Button
android:layout_width="@dimen/your_button_width" />
Тогда внутри вашего Java-файла:
int buttonSize= (int) (context.getResources().getDimension(R.dimen.your_button_width));
Автор: Gene
Размещён: 12.12.2014 10:52
0 плюса
Используйте код ниже:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.e("WIDTH",""+view.getWidth());
Log.e("HEIGHT",""+view.getHeight());
}
Автор: Asif Patel
Размещён: 10.02.2017 08:04
Вопросы из категории :
- android Насколько хорошо отражает эмулятор Android Phone?
- android Как сохранить состояние активности Android с помощью сохранения состояния экземпляра?
- android Android: доступ к дочерним представлениям из ListView
- android Как вызвать SOAP веб-сервис на Android
- android Как вы форматируете дату и время в Android?
- android Android: Получение имени файла с камеры?
- layout BoxLayout не может быть общей ошибкой
- layout Усечение длинных строк с помощью CSS: возможно?
- layout Получить размеры экрана в пикселях
- layout Андроид LinearLayout
- layout Как получить размер глифа шрифта?
- layout Ruby on Rails layouts ... кроме и только ошибка
- measurement Измерение времени выполнения Java, использования памяти и загрузки процессора для сегмента кода
- measurement Как я могу измерить скорость кода, написанного на PHP?
- measurement Линейка инструментов в C #
- measurement Если я вызываю getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0
- measurement Техническая погрешность измерения между двумя колонками
- measurement Альтернативы для измерения скорости интернета