忍者ブログ

アンドロイドのあれこれ

Fragmentとマルチスクリーン
(´;ω;`)どうせ、ふらぐめんと・・・弱いので簡単なサンプルだけ作ってみました。
そういえば一年前にもFragment勉強しようそうしようとつぶやいていたが今になってもFragmentの使い方書き方なにひとつも理解していません。

Android Developers 公式サイトのサンプルもあるので
Supporting Multiple Screens - http://developer.android.com/guide/practices/screens_support.html

スマートフォンで実行すると普通のひとつの画面が表示され、タブレットでみると分かれて2画面表示になるアプリのサンプルです。

レイアウト用意する
/res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />

/res/layout-large/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment android:name="com.example.myfragment.MyListFragment"
android:id="@+id/title_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />

<fragment android:name="com.example.myfragment.MyDetailFragment"
android:id="@+id/detail_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />

</LinearLayout>

/res/layout/detail_view.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:textSize="18sp" />


MainActivity.java
public class MainActivity extends FragmentActivity 
implements MyListFragment.OnMyListSelectedListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//レイアウトが fragment_containerではない場合、最初にフラグメントを追加する
if (findViewById(R.id.fragment_container) != null) {
if (savedInstanceState != null) {
return;
}

MyListFragment listFragment = new MyListFragment();
listFragment.setArguments(getIntent().getExtras());

getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, listFragment).commit();
}
}

//MyListFragmentからitemが選択されたとき
public void onDetailSelected(int position) {

//詳細を表示するフラグメントを取り込む
MyDetailFragment detailFragment = (MyDetailFragment)
getSupportFragmentManager().findFragmentById(R.id.detail_fragment);

//詳細のフラグメントがすでに使用できるときはアップデートする(2画面表示の場合)
if (detailFragment != null) {
detailFragment.updateDetailView(position);
} else { //(1画面表示の場合)
MyDetailFragment newFragment = new MyDetailFragment();
Bundle args = new Bundle();
args.putInt(MyDetailFragment.ARG_POSITION, position);
newFragment.setArguments(args);

//トランザクションをバックスタックに追加
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
}

MyListFragment.java
public class MyListFragment extends ListFragment {
OnMyListSelectedListener mCallback;

public interface OnMyListSelectedListener {
public void onDetailSelected(int prosition);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
? android.R.layout.simple_list_item_activated_1
: android.R.layout.simple_list_item_1;

setListAdapter(new ArrayAdapter<String>(getActivity(), layout, ItemData.ItemTitle));
}

@Override
public void onStart() {
super.onStart();

//2画面表示のとき、選択されたリストアイテムを強調表示させる(ハイライト)
if (getFragmentManager().findFragmentById(R.id.detail_fragment) != null) {
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
}


@Override
public void onAttach(Activity activity) {
super.onAttach(activity);

try {
mCallback = (OnMyListSelectedListener) activity;
} catch (ClassCastException e) {
}
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
mCallback.onDetailSelected(position);
getListView().setItemChecked(position, true);
}
}

MyDetailFragment.java
public class MyDetailFragment extends Fragment {
final static String ARG_POSITION = "position";
private int mCurrentPosition = -1;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

//Activityが再成されたとき(例えば画面回転からなど)、
//onSaveInstanceStateによって設定された前の詳細の選択を復元
if (savedInstanceState != null) {
mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);
}

return inflater.inflate(R.layout.detail_view, container, false);
}

@Override
public void onStart() {
super.onStart();

Bundle args = getArguments();
if (args != null) {
updateDetailView(args.getInt(ARG_POSITION));
} else if (mCurrentPosition != -1) {
updateDetailView(mCurrentPosition);
}
}

public void updateDetailView(int position) {
TextView article = (TextView) getActivity().findViewById(R.id.detail);
article.setText(ItemData.ItemDetail[position]);
mCurrentPosition = position;
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

//フラグメントを再成する必要があるときは現在の選択されたものを保存
outState.putInt(ARG_POSITION, mCurrentPosition);
}
}

ItemData.java
public class ItemData {
//リストのタイトル
static String[] ItemTitle = {
"My item 1",
"My item 2",
"My item 3",
"My item 4",
"My item 5",
"My item 6"
};

//リストを選択したとの詳細ページ
static String[] ItemDetail = {
"detail1 detail1 detail1 detail1 detail1 detail1 detail1 detail1 detail1 detail1 detail1 detail1 ",
"detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 detail2 ",
"detail3 detail3 detail3 detail3 detail3 detail3 detail3 detail3 detail3 detail3 detail3 detail3 ",
"detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 detail4 ",
"detail5 detail5 detail5 detail5 detail5 detail5 detail5 detail5 detail5 detail5 detail5 detail5 ",
"detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 detail6 "
};
}


実行イメージ
スマートフォンのとき
Fragmentとマルチスクリーン Fragmentとマルチスクリーン

タブレット(Nexus 7)
Fragmentとマルチスクリーン
COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]