2012年10月20日土曜日

Android 4.1(JellyBean)でWebViewにタイトルバーを追加する方法とかいろいろ

標準ブラウザとかその他大体のブラウザではWebView上でスクロールすると、タイトルバーも追従してスクロールされます。
昔はScrollViewの中にWebView突っ込んだりして試行錯誤してたのですが、標準ブラウザのソース見るととても簡単に実装してあったのでまとめておく。
↑って書いててずっと放置してたんだけど、今日タイトルバー関連APIについていろいろ分かったのでJellyBean向けとしてこれから頑張って書く。
JellyBeanではsetEmbeddedTitleBarが無くなっちゃいましたからね…。

本文の15割はhttp://code.google.com/p/android-titlebar-webview/からのパクリです。

続きは続きで

AndroidのEclair(2.0か2.1かその辺)からJellyBeanまでは、
void WebView#setEmbeddedTitleBar(View)
を使います。
ただし本当にEclairで動くかは確かめてないです。
メソッド自体はWebView.java自体に書かれてるんですがね。
Froyo以上では確実に動きます。確かめました。
このAPI、@hideが付いているのでリフレクション経由で使うってなんかこれ前の記事で書いたような気がする。省略。

さて

JellyBeanではまずWebViewを継承した独自クラス作ります。
さらにさらにandroid.webkit.WebViewClassic.TitleBarDelegateをimplements(実装)します。
ただしこのインターフェース、あいも変わらず非公開なので、自分でandroid.webkit.WebViewClassicというクラスを作って、その中にTitleBarDelegateというinterfaceを作ります。
TitleBarDelegateの中身はむっちゃシンプルなのでWebViewClassic.java拾ってきてそこからコピペ。

public final class WebViewClassic{
 public interface TitleBarDelegate {
  int getTitleHeight();
  public void onSetEmbeddedTitleBar(final View title);
 }
}
↑要するにこんなクラスをandroid.webkit内に入れる。だけ。
implementsしたら中身書きます。
@Override
public int getTitleHeight() {
 if(mTitleBar != null) return mTitleBar.getHeight();
 return 0;
}

@Override
public void onSetEmbeddedTitleBar(final View title){}
中身はこんな感じ。mTitleBarはもちろんタイトルバーのView。
これだけだとまだタイトルバーのアタッチができてないので、とりあえずタイトルバーを追加する処理を入れます。
適当にsetTitleBar(View view)みたいな関数作ってその中で、いろいろ処理することにしよう。
public void setTitleBar(View view){
 if(mTitleBar != null) removeView(mTitleBar);
 mTitleBar = view;
 if(view != null) addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 0, 0));
}
だいたいこんな感じ。
LayoutParamsを指定してあげないと、タイトルバー中のweightが効かなかったりするみたいです。よくわかりませんけど。
MATCH_PARENTを指定するのが肝なんじゃないかと個人的には思っているとかどうこう。
WebViewは中でAbsoluteLayout使ってるのでLayoutParamsでLintの警告が出たりするとかどうこう。
グダグダだったけど終わり。おやすみ。

0 件のコメント:

コメントを投稿