Подтвердить что ты не робот

Получить высоту и ширину компоновки программно

Я разработал макет, в котором 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

Я хочу, чтобы решение получало высоту и ширину любого макета программно?

4b9b3361

Ответ 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
    }