2013-08-06 2 views
7

У меня есть LinearLayout с шириной, установленной в xml как fill_parent, теперь мне нужна ее ширина во время выполнения программно. Так что я сделал это:Android: получить ширину макета программно с fill_parent в xml

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
    LayoutParams layParamsGet= layoutGet.getLayoutParams(); 
    int width=layParamsGet.width; 

Но было найдено width значения на отладке, чтобы быть -1, никто с идеей, почему я не могу получить точную ширину во время выполнения для LinearLayout с fill_parent установлен в макете XML.

ответ

27

Jens Vossnack работает отлично. Тем не менее, я обнаружил, что метод onGlobalLayout() GlobalLayoutListener вызывается повторно, что может быть неприемлемо в некоторых случаях.

У меня есть более простой подход к работе.

myLayout = (RelativeLayout) findViewById(R.id.my_layout); 
myLayout.post(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      Log.i("TEST", "Layout width : "+ myLayout.getWidth()); 

     } 
    }); 
+1

+1 за хороший ответ –

+0

Это был ответ я искал, мне нужно измерить View и использовать в то время Посмотреть еще не скомпонованные, он всегда возвращается 0, пока я не нашел ответ на свой вопрос, thanks –

+2

Почему это хорошо работает в потоке, но за пределами возвратов 0? –

0

layoutGet.getWidth() должны работать

4

Вы можете попробовать слушать событие globalLayout и получить ширину там. Вероятно, вы получите значение -1, потому что вы пытаетесь получить ширину перед выделением представлений.

vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     //Do it here 
     LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
     LayoutParams layParamsGet= layoutGet.getLayoutParams(); 
     int width=layParamsGet.width; 
     removeOnGlobalLayoutListener(layoutGet, this); // Assuming layoutGet is the View which you got the ViewTreeObserver from 
    } 
}); 

@SuppressLint("NewApi") 
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){ 
    if (Build.VERSION.SDK_INT < 16) v.getViewTreeObserver().removeGlobalOnLayoutListener(listener); 
    else v.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
} 

(вто это вид вы хотите, чтобы получить ширину)

1

Если вы посмотрите на значение для FILL_PARENT (вы должны использовать MATCH_PARENT поскольку FILL_PARENT теперь устаревшее) вы заметите значение это -1. LayoutParams - это просто атрибуты того, как должен выглядеть ваш взгляд. Когда представление завышено и выглядит так, как указывают параметры, представление не возвращается и не изменяет эти Парамы, чтобы отражать фактические значения вида (ширина/высота/и т. Д.).

Если вы хотите получить фактическую ширину своего вида, вам нужно будет позвонить getWidth() на ваш взгляд после того, как макет был завышен и отображен. Вызов getWidth() до того выставлялись макет приведет к 0.

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
int width = layoutGet.getWidth(); 
0

Прежде всего, вы должны использовать match_parent вместо fill_parent (устаревшее).

Когда вы делаете int width=layParamsGet.width;, вы принимаете правильный результат, который равен -1, соответствующему на fill_parent. Если вы wan't, чтобы получить реальную ширину, вам нужно ждать onMesure() вызова и использовать подход

LinearLayout layoutGet=(LinearLayout) findViewById(R.id.GameField1); 
int width = layoutGet. getMeasuredHeight(); 
Смежные вопросы