ActionBarの動作*1 を見ようとサンプルを動かすのにちと悩んだのでメモ。
eclipseにて以下の四つのプロジェクトを作成(Android Project Existing Code)
・extras/android/support/v7/appcompat/
・extras/android/support/v7/gridlayout/
・extras/android/support/v7/mediarouter/
・extras/android/support/samples/Support7Demos/
全てのプロジェクトで Build Targetを 4.3へ設定。
android-support-v7-mediarouterが依存するライブラリとして android-support-v7-appcompatを設定。
Support7Demosが依存するライブラリとして android-support-v7-appcompat、android-support-v7-gridlayout、android-support-v7-mediarouterの三つを設定。
SampleMediaRouterActivity/DiscoveryFragmentに @SuppressLint(“ValidFragment”)設定。*2
以上でビルドできるようになるので実機で動かしてみる。
2013/07/27追記
eclipseからプロジェクトを作るときに extras/android/を指定して一度に作ってやればちまちま設定をする必要が無いのね。
2013/08/01追記
ActionBarTabsを動かして端末を回転させたら落ちた。
コードを見るとえらい手抜きだったので修正を。*3
TabContentFragmentと onAddTabメソッドを丸ごと入れ替え。
3525-0.java…
public void onAddTab(View v) {
final ActionBar bar = getSupportActionBar();
final int tabCount = bar.getTabCount();
final String text = "Tab " + tabCount;
bar.addTab(bar
.newTab()
.setText(text)
.setTabListener(
new TabListener(TabContentFragment.newInstance(text))));
}
…
public static class TabContentFragment extends Fragment {
private static final String Arg_Text = "text";
static TabContentFragment newInstance(String text) {
TabContentFragment frg = new TabContentFragment();
Bundle args = new Bundle();
args.putString(Arg_Text, text);
frg.setArguments(args);
return frg;
}
public String getText() {
return getArguments().getString(Arg_Text);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View fragView = inflater.inflate(R.layout.action_bar_tab_content,
container, false);
TextView text = (TextView) fragView.findViewById(R.id.text);
text.setText(getText());
return fragView;
}
}
…
2013/12/05追記
@SuppressLint(“ValidFragment”)について調べて飛んでくる人がポツポツいるので追記を。
Fragmentは自分で明示的に作成する他にシステムが復旧のために作成することがあるので、明示的に作成した時に SetArgumentsで設定した情報だけから作成できないといけない。
ということは、インナークラスの場合は staticである必要があるし、コンストラクタが存在しないか、引数無しのコンストラクタが publicになっている必要がある。
Lintはその辺が守られているかチェックしてエラーとしてくれるわけだ。
が、時にはその辺を考慮する必要がない一時的なコードというのも存在するので件の注釈を入れて Lintを黙らすと。
逆にそういう理由が無く、なんだかわからないけどこれを書くと黙らせることが出来る的な理由で書いてはいけない注釈である。
android.support.v7.app.ActionBar
3.x未満で ActionBarを実現するには SDKにサンプルとして含まれている ActionBarCompatを使うか、サードパーティ製のライブラリを使うのが今までの定石…なんだと思う。 が、Android 4.3に対応する APIと共にリリースされた Support Libraryにはずばり ActionBarという代物が含まれている。 Support7Demosを動かして ActionBarCompatよりちゃんと ActionBarしてるっぽいので自アプリに組み込んでみようと思う。記事を書…