ViewPager wrap_content일때 Height 구하기

Posted by ITPangPang
2016. 12. 13. 22:28 안드로이드(android)/ViewPager


ViewPager wrap_content일때

 Height 구하기



ㆍ 음 이번글은 특별한 경우일때 쓰이는 방법입니다.


ㆍ 프로젝트를 하면서 ViewPager의 height값을 구하는 경우가

    생겨서 구글링을 하다가 찾은 내용입니다.



어떤 상황인가?


제목 그대로 ViewPager의

height가 wrap_content일때

ViewPager의 height값을 구하는

상황입니다.



이게 무슨 말인가 하면

그냥 ViewPager.getHeight();

하면 될까요?


xml에서

ViewPager를 하나

넣어보겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.tistory.itpangpang.viewpagermeasure.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</LinearLayout>


자 이렇게 넣었을때

ViewPager의 height값은

얼마일까요?


눈으로 봤을때는

android:layout_height = "wrap_content"

로 잡혀있으니 당연히

ViewPager 안에 들어있는 내용에 따라

height이 결정되겠죠?


그런데 옆에 preview 화면을

보게되면


이렇게 match_parent를

넣은 것 처럼 눈에 보입니다.


뭐 preview에만 그럴 수 있으니

Viewpager안에 텍스트를 채워 넣어보면

되겠죠?



자 이렇게 첫번째 페이지에 들어갈

Text를 대충 써봤습니다.


그리고 앱을 실행시켜보겠습니다.


자 이렇게 잘 나오네요

그럼 111로 채워진 부분이 ViewPager의

높이가 되겠네요


높이를 한 번 측정해보겠습니다.


Log.d("ITPANGPANG","ViewPager height : "+vp.getHeight());


이렇게 쓰면 될 것 같습니다.



결과를 보니

986이라는 높이가 나옵니다.

뭔가 잘못됬죠?


111로 채워진부분이 986이라는

높이를 차지할리가 없습니다.


이 값은 위 preview에서

본 것 처럼 match_parent일때나

가능한 수치입니다.



자, 이렇듯

ViewPager를 커스텀없이

그대로 쓰게 될 경우


화면이 열리면서 ViewPager의

height값을 구해야 할때

항상 match값만 얻게 됩니다.


height값을 구해야하는

상황이 매우매우 다양하겠지만.


제가 프로젝트 하면서

ViewPager의 height를

구했어야 하는 이유는


<Linear>

<ViewPager>


이렇게 구성되어있을때

유저가

<Linear>와 <ViewPager>의

영역을 자유자재로 변경할 수 있는

화면이었는데, 

그때 가장 최초 화면이 열릴때

ViewPager의 높이를 알고 있어야하는

상황이었습니다.

(유저가 ViewPager의 처음영역보다

작게할 수 없게하는 뭐 그런..화면이었습니다.)


자 그럼 어떻게하면 구할수 있을까요?


방법은 생각보다 간단했습니다.

서치를 좀 해보니, 나름 많이들 쓰는

코드인 것 같았습니다.

(여러군데에서 같은 코드를 발견한것 보면..)


코드를 보겠습니다.

(출처는 아래 남기겠습니다)

public class CustomViewPager extends ViewPager
{
public CustomViewPager(Context context, AttributeSet attrs)
{
super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int height = 0;
for(int i = 0; i < getChildCount(); i++)
{
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if(h > height)
{
height = h;
}
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}


내용이 길지 않은 코드이고

아주 복잡한 코드도 아닙니다.


ViewPager안에 있는 자식뷰의

height를 측정해서

(int) height에 저장합니다.


모든 자식뷰의 height를 구해서

가장 큰 값을

ViewPager의 height로 셋팅합니다.



xml에는 이렇게 넣으시면 됩니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.tistory.itpangpang.viewpagermeasure.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
<com.tistory.itpangpang.viewpagermeasure.CustomViewPager
android:id="@+id/vp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>



자바코드에는 이런식으로

넣으시면 되겠죠?

public class MainActivity extends AppCompatActivity
{
CustomViewPager vp;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vp = (CustomViewPager)findViewById(R.id.vp);


이렇게 하고 아까처럼

똑같이 getHeight로

ViewPager의 Height값을

구해보겠습니다.


Log.d("ITPANGPANG","ViewPager height : "+vp.getHeight());



잘 나왔습니다!~


전체코드는 생략하겠습니다.

출처에 나와있는 코드가 가장 중요한 부분이므로..



ViewPager 코드 출처

http://stackoverflow.com/questions/8394681/android-i-am-unable-to-have-viewpager-wrap-content