目次
フラグメント
Android 3.0から追加された新機能。
画面サイズに応じてアプリがスケールする仕組み。
特にタブレット向けの機能。
らしい。先生の言うことにゃあ、今熱い!これから来る!っていう感じ、とのこと。でも半年前にこれからはフラグメントの時代だぜ!って盛り上がった勢いは無いらしいからこれからの動向次第、らしい。
今回は2つのフラグメントを配置したアプリの作成をする。
用意するファイル
src/パッケージ/MainActivity.java(メイン表示、ありもの)
src/パッケージ/MyFragment1.java(フラグメントその1)
src/パッケージ/MyFragment2.java(フラグメントその2)
res/layout/activity_main.xml(メインレイアウト、ありもの)
res/layout/fragment1.xml(フラグメントレイアウトその1)
res/layout/fragment2.xml(フラグメントレイアウトその2)
フラグメントを継承する
MainActivity.javaにFragmentActivityを継承する。
6 |
public class MainActivity extends FragmentActivity { |
こんな感じで。
※インポートするときはandroid.support.v4.app.FragmentActivityを使うと1.6以降から対応できるらしい。とりあえずFragment関連のインポートはv4にしておこうね、とのこと。
フラグメントの作成
まず一つ目。
fragment1.xmlに表示させたいレイアウトを作る。
中身は何でもOK。
そしてMyFragment1.javaを下記のように。
3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment1, container, false); } } |
Fragmentを継承して、onCreatViewを実装する。戻り値に作ったxmlを設定する。
2つ目も同じように作る。
アクティビティにフラグメントを取り込む
activity_main.xmlにそれぞれのフラグメントクラスの領域を指定してあげる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <fragment android:id="@+id/fragment" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" class="com.example.package.MyFragment" /> <fragment android:id="@+id/fragment2" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" class="com.example.package.MyFragment2" /> </LinearLayout> |
実行画面
動的にフラグメントを呼び出す
特定idのレイアウトにMainActivityで指定したFragmentクラスを呼び出す。
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // FragmentManagerのインポートはsupport.v4の方をすること // マネージャーを作る FragmentManager fm = getSupportFragmentManager(); // マネージャーがbeginTransactionすることによって一連の処理ができる。 FragmentTransaction ft = fm.beginTransaction(); // どこに、何を、タグ付け ft.add(R.id.layout_a, new MyFragment(), "fragment1");// idがlayout_aのレイアウトにMyFragmentが持っているレイアウトを表示させる ft.add(R.id.layout_b, new MyFragment(), "fragment2");// idがlayout_bのレイアウトにMyFragmentが持っているレイアウトを表示させる // commitで実行 ft.commit(); } } |
フラグメントからフラグメントへ情報を引き継ぐ
一つ目のフラグメントクラスで両方の情報を処理する。
ミソはfindViewする時にgetActivity()から呼び出すこと。
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Fragment1 extends Fragment { EditText et; Button btn; TextView tv; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment1, container, false); } @Override public void onStart() { super.onStart(); findView(); addEvent(); } private void findView() { et = (EditText) getActivity().findViewById(R.id.editText1); btn = (Button) getActivity().findViewById(R.id.button1); tv = (TextView) getActivity().findViewById(R.id.textView1); } private void addEvent() { btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { tv.setText(et.getText().toString()); } }); } } |
getActivity()でfindViewしてしまえば後は普段のActivityと同じように書ける。
レイアウトを画面の向きによって変更する
resにlayout-landフォルダを作成する。
そこにlayout内と同名のxmlファイルを置く。
layout-landフォルダは横向きの時のレイアウトを表示させる。
リストビューのフラグメント
リストを表示させる。フラグメントクラスのコードは下記の通り。
呼び出し方はxmlにクラス指定するやり方なので割愛。
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import android.os.Bundle; import android.support.v4.app.ListFragment; import android.widget.ArrayAdapter; public class MyListFragment extends ListFragment { public final String[] Data = { "A","B","C","D","E","F","G","H","I","J","K","L","M","N" }; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.fragment, Data); setListAdapter(adapter); } } |
ListFragmentを継承する。中身は普通のArrayAdapter。
先生のおすすめサイト
Y.A.M の 雑記帳
Android Fragment を使う
今日やったこと
DialogFragmentとViewPagerやったよ!
まとめられない・・・・
ViewPagerはスワイプでページ切り替えが出来る熱い機能だったので今度まとめようと思ふ・・・・
とりあえず参考サイトおいておきます・・・
やっぱり皆さんガッツリコード書いてらっしゃる・・・・
コメント
No Trackbacks.