Получить высоту и ширину компоновки программно
Я разработал макет, в котором LinearLayout
имеет 2 дочерних LinearLayout
и FrameLayout
, а в каждом дочернем я помещаю разные представления.
Я просто хотел измерить высоту и ширину FrameLayout
, чтобы я мог выполнять свою задачу.
В программе я использую
int height,width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();
возвращает значение как 0
для обоих
Даже я пробовал со следующим кодом
int height, width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();
возвращает то же значение 0
и, наконец, я попробовал со следующим кодом,
int height, width;
FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;
возвращает меня -2
и -1
Я хочу, чтобы решение получало высоту и ширину любого макета программно?
Ответы
Ответ 1
Сам вид имеет свой жизненный цикл, который в основном выглядит следующим образом:
-
приложенный
-
измеренный
-
раскладка
-
Рисовать
Таким образом, в зависимости от того, когда вы пытаетесь получить ширину/высоту, вы можете не увидеть то, что ожидаете увидеть, например, если вы делаете это во время onCreate, представление может даже не измеряться к тому времени, с другой стороны. если вы сделаете это во время метода кнопки onClick, скорее всего, это представление было присоединено, измерено, размещено и отрисовано, поэтому вы увидите ожидаемое значение, вам следует реализовать ViewTreeObserver, чтобы убедиться, что вы получаете значения в нужный момент.
LinearLayout layout = (LinearLayout)findViewById(R.id.YOUD VIEW ID);
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
int width = layout.getMeasuredWidth();
int height = layout.getMeasuredHeight();
}
});
Ответ 2
Как говорят в CapDroid, вы пытаетесь получить размер до того, как будет отображено представление, другое возможное решение может заключаться в том, чтобы сделать сообщение с работоспособным представлением в представлении:
mView.post(new Runnable() {
@Override
public void run() {
int width = mView.getWidth();
int height = mView.getHeight();
}
}
Ответ 3
Я думаю, что вы получаете метод Height и Width в методе OnCreate(), поэтому вы всегда получаете 0 значений, потому что в то время ваш просмотр еще не создан.
Попытайтесь получить высоту и ширину при нажатии одной кнопки или еще.
Ответ 4
Если вы получаете -1 или -2, это также может быть числовое значение LayoutParams.WRAP_CONTENT (-2) или LayoutParams.MATCH_PARENT (-1).
Ответ 5
просто дайте свой рост, и вы получите высоту или даже ширину, если захотите.
/** * Получить высоту представления перед отображением вида * @param просмотреть представление для измерения * @вернуть высоту представления */
public static int getViewHeight(View view) {
WindowManager wm =
(WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int deviceWidth;
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
Point size = new Point();
display.getSize(size);
deviceWidth = size.x;
} else {
deviceWidth = display.getWidth();
}
int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(widthMeasureSpec, heightMeasureSpec);
return view.getMeasuredHeight(); // view.getMeasuredWidth();
}
Ответ 6
Самый простой способ - использовать ViewTreeObserver, если вы напрямую используете .height или .width, вы получаете значения как 0, из-за того, что представления не имеют размера, пока они не рисуют на нашем экране. В следующем примере показано, как использовать ViewTreeObserver
ViewTreeObserver viewTreeObserver = YOUR_VIEW_TO_MEASURE.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
YOUR_VIEW_TO_MEASURE.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int viewHeight = YOUR_VIEW_TO_MEASURE.getHeight();
int viewWeight = YOUR_VIEW_TO_MEASURE.getWidth();
}
});
}
если вам нужно использовать этот метод, используйте это и сохраните значения, которые вы можете использовать глобальные переменные.
Ответ 7
У меня была та же проблема, но я не хотел рисовать на экране перед измерением, поэтому я использовал этот метод измерения вида, прежде чем пытаться получить высоту и ширину.
Пример использования:
layoutView(view);
int height = view.getHeight();
//...
void layoutView(View view) {
view.setDrawingCacheEnabled(true);
int wrapContentSpec =
MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
view.measure(wrapContentSpec, wrapContentSpec);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
}
Ответ 8
попробуйте с помощью этих методов:
int width = mView.getMeasuredWidth();
int height = mView.getMeasuredHeight();
Или же
int width = mTextView.getMeasuredWidth();
int height = mTextView.getMeasuredHeight();
Ответ 9
В Kotlin вы можете просто сделать это:
fr.post {
height=fr.height
width=fr.width
}
Ответ 10
Первый фрагмент верен, но его нужно называть после выполнения onMeasure()
. В противном случае размер еще не измеряется для представления.
Ответ 11
Для кадра:
height=fr.getHeight();
width=fr.getWidth();
Для экрана:
width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();
Ответ 12
попробуйте что-то вроде этого кода из этой ссылки
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
viewWidth = view.getWidth();
viewHeight = view.getHeight();
}
});
}
надеюсь, что это поможет.
Ответ 13
Я использовал DisplayMetrics для получения размера экрана, а затем я могу назначить ширину/высоту элементу в% age
Это будет как
DisplayMetrics dmetrics = new DisplayMetrics();
int widthPixels=dmetrics.widthPixels;
int heightPixels=dmetrics.heightPixels;
//setting the height of the button
button_nextPuzzle.setMinHeight((int) ((heightPixels/3)*.30));
Работал для меня очень хорошо!!!
Ответ 14
Поскольку я только столкнулся с этой проблемой, думал, что напишу это для kotlin,
my_view.viewTreeObserver.addOnGlobalLayoutListener {
// here your view is measured
// get height using my_view.height
// get width using my_view.width
}
или
my_view.post {
// here your view is measured
// get height using my_view.height
// get width using my_view.width
}