보기의 치수를 검색하는 방법은 무엇입니까?
저는 로 구성된 견해를 가지고 있습니다.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
'programing' 카테고리의 다른 글
| Android ListView 행을 추가 또는 제거하는 애니메이션 방법 (0) | 2023.08.15 |
|---|---|
| 특정 파이썬 버전으로 콘다 환경을 만드는 방법은 무엇입니까? (0) | 2023.08.10 |
| 테이블을 올바르게 자를 수 있는 방법은 무엇입니까? (0) | 2023.08.10 |
| Mac용 도커 데스크톱을 시작할 수 없습니다. (0) | 2023.08.10 |
| MariaDB 커넥터 J: autoReconnect가 기본 페일오버에 대해 작동하지 않음 (0) | 2023.08.10 |