ViewPagerは全画面で設置することが想定されているのか、wrap_contentをサポートしていません。
前回の投稿で、main.xmlのViewPagerビューをandroid:layout_height=”wrap_content”とすると、高さが0になってしまいます。
これを解決しようとすると、下記のページが参考になるでしょう。
Android: I am unable to have ViewPager WRAP_CONTENT
なかなか難しそうです。
もっと簡単にwrap_contentを有効にする方法はないかと試行錯誤しました。
そして、ちょっと卑怯っぽいですが、とても簡単に有効にする方法を見つけました。
まずはレイアウトxml部分。
<android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="fill_parent" android:layout_height="wrap_content" />
前回の投稿から、android:layout_height=”fill_parent”からwrap_contentに変更します。
そして、下記のような追記をします。
<ImageView android:id="@+id/pager_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY" android:src="@drawable/image01" /> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="fill_parent" android:layout_height="wrap_content" />
このImageViewはどこから来たかというと、ViewPagerの1ページごとに貼りつける画像です。
いったんこのままで実行してみてください。
当たり前ですが、image01が貼りつけられた、動かないImageViewが載っているだけかと思います。
重要なのはここからです。
実際にViewPagerを動かすとき、どれくらいの高さにしたいのでしょうか。
そうです、今回追記したImageViewのそのままの高さにしたいのです。
では、ImageViewの高さを取得しましょう。
参考:
TextViewやImageViewなど、設置されているViewのサイズを取得したいとき
[MainActivity.java]
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); //いったん仮でImageViewに元画像をセットして、ImageViewの高さだけ取得してView.GONE ImageView pager_image = (ImageView)findViewById(R.id.pager_image); int height = pager_image.getMeasuredHeight(); pager_image.setVisibility(View.GONE); //viewPagerに高さをセット @SuppressWarnings("deprecation") LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, height); viewPager.setLayoutParams(lp); }
高さをheightに取得したあとは、ImageViewは用済みなのでView.GONEです。
あとは、ViewPagerにLayoutParamsでheightを当てはめたらwrap_contentが有効(にしたのと同じ効果)になります!
けっこう、「邪道」というか「裏ワザ」というか、コードを駆使して問題を解決したというよりも、ズルがしこく切り抜けたという感じの方法ですね。(自分でもそう思います。汗)
あと、ライフサイクル的にこの方法が問題ないのか、というのもちょっと気になります。色んな端末でチェックしたところ、今の所は問題なさそうですが……。
もし何か危険なことがあれば、どなたかコメント欄で教えてくださいm(__)m
コメントを残す