2011年12月31日土曜日

Android Compatibility PackageでFragmentを楽しむ

Android 3.0より低いバージョンでFragmentを利用する場合は、Android Compatibility
Packageをインストールする必要があります。Android Compatibility Packageは
SDK Managerからインストールすることが可能です。

android-sdk-windows\extras\android\compatibility
以下にファイルが作成されていれば、インストールされています。


1. Android Projectを作成します
2. android-support-v4.jarファイルを適当なところにコピーします
 - android-sdk-windows\extras\android\compatibility\v4にあります
- 例えばlibsフォルダを作成してその下にコピーするなど
3. Eclipseでjarにパスを通します
- プロジェクト名-> Property -> Java Build Path -> Add JARs

<サンプルコード>

試しに、Fragmentのサンプルの簡易版を動かしてみて、Android2.3の
Xperiaで動作することが確認できました。ICSが出る前に先行して開発が
進められそうで便利そうです。

基本のサンプルは、以下のページにあるものをAndroid Compatibility
Packageにあわせて修正したものです。

package jp.gr.java.conf.ulexite.fragmenttest;

import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class TitlesFragment extends ListFragment {
private int mCurCheckPosition = 0;
private static final String[] mTitles = {"Title1", "Title2", "Title3", "Title4",
"Title5", "Title6", "Title7", "Title8"};

@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);

ArrayAdapter titlesArray = new ArrayAdapter(getActivity(),
R.layout.title, mTitles);
setListAdapter(titlesArray);

if (savedState != null) {
mCurCheckPosition = savedState.getInt("curChoice", 0);
}

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
showDetails(mCurCheckPosition);
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}

@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
showDetails(pos);
}

private void showDetails(int index) {
mCurCheckPosition = index;

getListView().setItemChecked(index, true);

// Check what fragment is shown, replace if needed.
DetailsFragment details = (DetailsFragment)
getFragmentManager().findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != index) {
// Make new fragment to show this selection.
details = DetailsFragment.newInstance(index);

// Execute a transaction, replacing any existing
// fragment with this one inside the frame.
FragmentTransaction ft
= getFragmentManager().beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(
FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
}