ViewPager wrap_content일때 Height 구하기
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
'안드로이드(android) > ViewPager' 카테고리의 다른 글
ViewPager 완전정복 - addOnPageChangeListener에 대해서 (3) | 2016.11.05 |
---|---|
ViewPager 완전정복 - setUserVisibleHint를 사용한 예제 (5) | 2016.11.02 |
ViewPager 완전정복 - setOffscreenPageLimit, setUserVisibleHint (2) | 2016.10.31 |
ViewPager 완전정복(탭 꾸미기) (3) | 2016.10.31 |
ViewPager 완전정복(일단 만들기) (17) | 2016.10.28 |