2015-11-10 4 views
0

Мне нужно получить ширину и высоту линейного макета, однако я не знаю, когда Relative Layout готова предоставить мне эти два атрибута.get width, height from Layout

но это только возвращает 0.

мой экран enter image description here

пожалуйста, проверьте мой код, я понятия не имею.

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.LinearLayout; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     LinearLayout container = (LinearLayout)findViewById(R.id.container); 
     int width = container.getWidth(); 
     int height = container.getWidth(); 

     Log.d("MainActivity onCreate", "width #" + width + ", height #" + height); 
    } 
} 

и activity_main.xml макет

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <LinearLayout 
     android:background="#FFFFFFAA" 
     android:orientation="vertical" 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </LinearLayout> 

</RelativeLayout> 

как я это исправить?

ответ

1

Во-первых, вы вызываете getWidth дважды - для ширины и высоты.
Вы можете попробовать его с measureSpecs, как это:

int matchParentMeasureSpecWidth = View.MeasureSpec.makeMeasureSpec(((View) container.getParent()).getWidth(), View.MeasureSpec.EXACTLY); 
int matchParentMeasureSpecHeight = View.MeasureSpec.makeMeasureSpec((View) container.getParent()).getHeight(), View.MeasureSpec.EXACTLY); 
v.measure(matchParentMeasureSpecWidth, matchParentMeasureSpecHeight); 

int height = container.getMeasuredHeight(); 
1

Вы можете попробовать и mesaure его первым. Но убедитесь, что вы делаете это только после того, как все остальные представления добавлены, что ваш LinearLayout зависит от других видов.

LinearLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 
LinearLayout.getMeasuredWidth(); 
1

Попробуйте

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 

    final LinearLayout container = (LinearLayout)findViewById(R.id.container); 

      container.post(new Runnable() 
      { 

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

       } 
      }); 
3

Всякий раз, когда вы пытаетесь получить размеры на onResume() или onCreate() метода, он всегда возвращает 0. Таким образом, вы должны использовать ViewTreeObserver

ViewTreeObserver vto = container.getViewTreeObserver(); 
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
     container.getViewTreeObserver().removeOnPreDrawListener(this); 
     finalHeight = container.getMeasuredHeight(); 
     finalWidth = container.getMeasuredWidth(); 
     return true; 
    } 
}); 

Также вы можете настроить View, который будет проходит с LinearLayout и onMeasure() метода вы можете получить width и height.

1

Прежде всего заменить

int height = container.getWidth(); 

по

int height = container.getHeight(); 

container.getHeight() вернется 0 (а также container.getWidth()), если он еще не нарисовали.

решение было бы получить высоту после того, как на ваш взгляд является layouted:

container.post(new Runnable(){ 
    public void run(){ 
    int height = container.getHeight(); 
    } 
});