ViewPagerでwrap_contentを有効にする簡単な方法


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

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください