programing

보기의 치수를 검색하는 방법은 무엇입니까?

iphone6s 2023. 8. 10. 18:35
반응형

보기의 치수를 검색하는 방법은 무엇입니까?

저는 로 구성된 견해를 가지고 있습니다.TableLayout, TableRow and TextView저는 그것이 격자처럼 보이기를 원합니다.저는 이 그리드의 높이와 폭을 얻어야 합니다.getHeight()그리고.getWidth()항상 0을 반환합니다.그리드를 동적으로 포맷할 때와 XML 버전을 사용할 때 이 문제가 발생합니다.

뷰의 치수를 검색하는 방법은 무엇입니까?


다음은 디버그에서 결과를 확인하기 위해 사용한 테스트 프로그램입니다.

import android.app.Activity;
import android.os.Bundle;
import android.widget.TableLayout;
import android.widget.TextView;

public class appwig extends Activity {  
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.maindemo);  //<- includes the grid called "board"
      int vh = 0;   
      int vw = 0;

      //Test-1 used the xml layout (which is displayed on the screen):
      TableLayout tl = (TableLayout) findViewById(R.id.board);  
      tl = (TableLayout) findViewById(R.id.board);
      vh = tl.getHeight();     //<- getHeight returned 0, Why?  
      vw = tl.getWidth();     //<- getWidth returned 0, Why?   

      //Test-2 used a simple dynamically generated view:        
      TextView tv = new TextView(this);
      tv.setHeight(20);
      tv.setWidth(20);
      vh = tv.getHeight();    //<- getHeight returned 0, Why?       
      vw = tv.getWidth();    //<- getWidth returned 0, Why?

    } //eof method
} //eof class

OP가 사라진 지 오래되었다고 생각하지만, 이 답이 미래의 검색자들에게 도움이 될 수 있다면, 저는 제가 찾은 해결책을 게시하려고 생각했습니다.나는 이 코드를 나의 컴퓨터에 추가했습니다.onCreate()방법:

편집됨: 2011년 7월 5일 코멘트 코드 포함:

final TextView tv = (TextView)findViewById(R.id.image_test);
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        LayerDrawable ld = (LayerDrawable)tv.getBackground();
        ld.setLayerInset(1, 0, tv.getHeight() / 2, 0, 0);
        ViewTreeObserver obs = tv.getViewTreeObserver();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            obs.removeOnGlobalLayoutListener(this);
        } else {
            obs.removeGlobalOnLayoutListener(this);
        }
    }

});

먼저 나는 나의 마지막 참조를 받습니다.TextView((으)로 onGlobalLayout()방법)을 선택합니다.다음으로, 나는 이해합니다.ViewTreeObserver의 게서에서.TextView 추니다합을 합니다.OnGlobalLayoutListener 우선onGLobalLayout(여기서 호출할 수 있는 Superclass 메서드는 없는 것 같습니다...) 그리고 뷰의 측정값을 알아야 하는 내 코드를 이 수신기에 추가합니다.저는 모든 것이 예상대로 작동하기 때문에 이것이 도움이 되기를 바랍니다.

WindowsFocusChanged 메서드에 대한 활동을 재정의하는 다른 솔루션을 추가하면 여기서 getHeight(), getWidth() 값을 얻을 수 있습니다.

@Override
public void onWindowFocusChanged (boolean hasFocus) {
        // the height will be set at this point
        int height = myEverySoTallView.getMeasuredHeight(); 
}

아직 그려지지 않은 요소의 너비와 높이를 가져오려고 합니다.

디버그 및 중지를 사용하면 장치 화면이 여전히 비어 있는 것을 알 수 있습니다. 이는 요소가 아직 그려지지 않았기 때문에 존재하지 않는 너비와 높이를 얻을 수 없기 때문입니다.

제가 틀릴 , 그고틀수, 내릴있지만도가리,▁and만있.setWidth() 것은 .Layout합니다.child.measure()), 그래서 만약 당신이setWidth()요소가 그려진 후에는 이 너비를 얻을 수 없습니다.

당신이 필요로 하는 것은, 사용하는 것입니다.getMeasuredWidth()뷰가 실제로 그려진 후 어딘가에 (뷰의 가장 최근 측도) 표시됩니다.

들다기에 대해 .Activity최적의 순간을 찾기 위한 라이프사이클.

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

나는 좋은 관행은 사용하는 것이라고 믿습니다.OnGlobalLayoutListener다음과 같이:

yourView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (!mMeasured) {
                // Here your view is already layed out and measured for the first time
                mMeasured = true; // Some optional flag to mark, that we already got the sizes
            }
        }
    });

는 이코를직배수있다니습치할에 수 .onCreate()뷰가 배치될 때 호출됩니다.

다음과 같이 View의 게시 방법 사용

post(new Runnable() {   
    @Override
    public void run() {
        Log.d(TAG, "width " + MyView.this.getMeasuredWidth());
        }
    });

사용하려고 했습니다.onGlobalLayout()의 사용자 지정 형식 지정을 수행합니다.TextView @알아차렸듯이, @George Bailey는onGlobalLayout()는 실제로 두 번 호출됩니다. 한 번은 초기 레이아웃 경로에서, 두 번째는 텍스트를 수정한 후입니다.

View.onSizeChanged() 텍스트를 수정하면 메서드가 한 번(레이아웃 패스 중)만 호출되기 때문에 더 잘 작동합니다.이를 위해서는 다음의 하위 분류가 필요했습니다.TextView그러나 API 레벨 11+에서는 하위 분류를 피할 수 있습니다.

한가더지에서 을 정확하게 위해서, 뷰정한너얻기위해비를확의▁one▁in▁view위해▁of.View.onSizeChanged(),layout_width은 " " " 설해야합니다정로합다"로 합니다.match_parent,것은 아니다.wrap_content.

실제 그림을 얻기 전에 실행되는 다른 방법이나 생성자에서 크기를 구하려고 합니까?

모든 구성 요소를 실제로 측정하기 전에는 치수를 얻을 수 없습니다(XML은 디스플레이 크기, 부모 위치 등을 모르기 때문에).

onSizeChanged()(0으로 호출할 수 있지만) 이후에 값을 얻거나 실제 이미지가 언제 나타날지 기다리는 것만으로 시도해 보십시오.

에서 언급했듯이, 은 F.X. , 당은사있다니습할용했을 사용할 수 .OnLayoutChangeListener이 를 추적하고 싶은 에서.

view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        // Make changes
    }
});

초기 레이아웃만 원하는 경우 콜백에서 수신기를 제거할 수 있습니다.

이것이 당신이 살펴봐야 할 것 같습니다: 사용onSizeChanged()당신의 견해로는.다음은 사용 방법에 대한 확장 코드 조각입니다.onSizeChanged()레이아웃 또는 보기의 높이와 너비를 동적으로 확인하려면 http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html

ViewTreeObserver그리고.onWindowFocusChanged()전혀 필요하지 않습니다.

만약 당신이 부풀린다면.TextView레이아웃 및/또는 내용을 배치하고 설정합니다.LayoutParams그러면 사용할 수 있습니다.getMeasuredHeight()그리고.getMeasuredWidth().

하지만 당신은 조심해야 합니다 (아마도 다른).ViewGroups). 는 ) 다음에 수 onWindowFocusChanged()그러나 보기를 추가하려고 하면 모든 것이 그려질 때까지 해당 정보를 얻을 수 없습니다.의 는여러개추했습다니고려하가를나▁▁add습▁to니▁i▁was▁trying고를 추가하려고 했습니다.TextViewsLinearLayouts흉를내다를 FlowLayout (발음 스타일)을 수 없었습니다.Listeners프로세스가 시작되면 동기화된 상태로 계속 진행됩니다.따라서 이러한 경우 레이아웃에 뷰를 추가할 때처럼 나중에 사용할 수 있도록 너비를 변수에 유지하는 것이 좋습니다.

제안된 솔루션이 작동하더라도 모든 경우에 가장 적합한 솔루션은 아닐 수 있습니다. 이는 다음에 대한 문서를 기반으로 하기 때문입니다.ViewTreeObserver.OnGlobalLayoutListener

전역 레이아웃 상태 또는 뷰 트리 내의 뷰 가시성이 변경될 때 호출될 콜백에 대한 인터페이스 정의입니다.

즉, 여러 번 호출되며 뷰가 항상 측정되는 것은 아닙니다(높이와 너비가 결정됨).

다른 방법은 다음과 같습니다.ViewTreeObserver.OnPreDrawListener뷰를 그릴 준비가 되어 있고 모든 측정값이 있는 경우에만 호출됩니다.

final TextView tv = (TextView)findViewById(R.id.image_test);
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnPreDrawListener(new OnPreDrawListener() {

    @Override
    public void onPreDraw() {
        tv.getViewTreeObserver().removeOnPreDrawListener(this);
        // Your view will have valid height and width at this point
        tv.getHeight();
        tv.getWidth();
    }

});

요청할 때까지 뷰가 생성되지 않았기 때문에 높이와 너비가 0입니다. 한 가지 간단한 해결책은 다음과 같습니다.

view.post(new Runnable() {
    @Override
    public void run() {
        view.getHeight(); //height is ready
        view.getWidth(); //width is ready
    }
});

이 방법은 짧고 바삭바삭해서 다른 방법에 비해 좋습니다.

View 라이프사이클을 보는 것이 좋습니다. http://developer.android.com/reference/android/view/View.html 일반적으로 활동이 재개 상태가 될 때까지 너비와 높이를 확실히 알아야 합니다.

OnResume()에서 호출되는 브로드캐스트를 사용할 수 있습니다.

예:

int vh = 0;   
int vw = 0;

public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.maindemo);  //<- includes the grid called "board"

      registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                TableLayout tl = (TableLayout) findViewById(R.id.board);  
                tl = (TableLayout) findViewById(R.id.board);
                vh = tl.getHeight();       
                vw = tl.getWidth();               
            }
      }, new IntentFilter("Test"));
}

protected void onResume() {
        super.onResume();

        Intent it = new Intent("Test");
        sendBroadcast(it);

}

kcopock이 응답했기 때문에 OnCreate(), OnStart() 또는 Resume()에서 보기 높이를 가져올 수 없습니다.

단순 응답:이것은 문제없이 저에게 효과가 있었습니다.중요한 것은 보기에 초점을 맞추는 것입니다.높이 등hasFocus() 메서드를 사용한 다음 getHeight() 메서드를 순서대로 사용하여 이 작업을 수행합니다.코드 3줄만 있으면 됩니다.

ImageButton myImageButton1 =(ImageButton)findViewById(R.id.imageButton1); myImageButton1.hasFocus();

int myButtonHeight = myImageButton1.getHeight();

Log.d("Button Height: ", ""+myButtonHeight );//Not required

도움이 되길 바랍니다.

getMeasuredWidth() 및 getMeasuredWidth() 사용보기의 높이()입니다.

개발자 가이드: 보기

정정: 저는 위의 해결책이 형편없다는 것을 알았습니다.특히 당신의 전화가 느릴 때.그리고 여기서 저는 또 다른 해결책을 찾았습니다: 여백과 패딩을 포함한 요소의 px 값을 계산합니다: dp to px: https://stackoverflow.com/a/6327095/1982712

또는 dimens.xml을 px: https://stackoverflow.com/a/16276351/1982712 로 이동합니다.

sp to px: https://stackoverflow.com/a/9219417/1982712 (솔루션 포함)

또는 치수를 px로: https://stackoverflow.com/a/16276351/1982712

그리고 이것이 마지막입니다.

언급URL : https://stackoverflow.com/questions/4142090/how-to-retrieve-the-dimensions-of-a-view

반응형