素人のアンドロイドアプリ開発日記

fragmentのコンテンツ

Fragmentを勉強する その2

2015.07.01

使い方をまとめました。こちらの記事は考察なども含まれてるので、簡潔に分かりたい場合はこちらを参照してください

fragmentの使い方まとめ

その1に引き続いて、fragmentをcustomeViewのように利用をしてページ遷移をしてみます。

前回、FragmentManagerを用いる事で、fragmentの入れ替えをする事ができました。

メインのActivityでの記述になるので、現状ではメインのアクティビティ内においたボタンでの切り替えは可能ですが

fragment内のボタンで、移動させる方法を今回は紹介していきます。

 

もちろん、書き方はいくつかあるのですが、大きく分かれて2つあります。

1、activityの参照を引っ張ってくる。

fragment.setActivity(Activity act);

みたいな関数を用意して、Activityから、fragmentを作る時、自身の参照も渡して

act.setHello();

みたいに直接、Activityの関数を実装する方法

2、callback関数を用意して、それを使って記述をする方法。

setOnClickListner();

みたいな形で実装できるようにする。

があって、おすすめは2の方法です。

 

callback用のインターフェースをfragment内に記述

public interface CallbackFunction {
 public void callback_1(); 
}

する。そして、このコールバックを次の用に設定できるようにする

CallbackFunction callback;
 public void setOnCallbackFunction(CallbackFunction _callback){
 callback = _callback;
 }

これで、Activity側で

frag1.setOnCallbackFunction(new Fragment1.CallbackFunction() {
 @Override
 public void callback_1() {
 }
 });

みたいにセットをすると、

fragment内で

button.setOnClickListener(new OnClickListener() {
 @Override
 public void onClick(View v) {
 callback.callback_1();
 }
});

を実装する事で、コールバックをfragment->activityに送る事が出来ました。

 

ただ、これだと、setOnCallbackをし忘れると、ボタン押した時に、nullで落ちてしまうので、

if(callback != null)

かもしくは、

public Fragment1(CallbackFunction _callback) {
 callback = _callback;
 }

みたいにコンストラクタでコールバック設定を必須にしてしまう方法にしてます。

 

カテゴリー:fragment

Fragmentを勉強する その1

2015.07.01

使い方をまとめました。こちらの記事は考察なども含まれてるので、簡潔に分かりたい場合はこちらを参照してください

fragmentの使い方まとめ

Fragmentの紹介してるブログや記事、分かりにくいのが多すぎる気がする。

というのも、android2.3とかではsupportLibraryを使う必要があったけど、android4以降では必要なかったりして、何が正解なのか分からないのと目的もわからず、作ってるのが多いので、なので、今回は目的を明確にします。

・Activityのページ遷移をfragmentで実装してしまう。

という事を目的にします。タブレットの表示と、スマホの表示を分けたいとかの人は、今回はちょっと違います。

また、最初からfragmentを配置などもできるようですが、それも別の機会で考えます。

メインのxml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:id="@+id/frag"
 tools:context="com.example.fragmenttest.MainActivity" >
</FrameLayout>

として、Activityは継承はActivityで大丈夫です

一方で、fragmentクラスを作ります。

public class Fragment1 extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
 return inflater.inflate(R.layout.frag1, container,false);
 }
}

として、レイアウトファイルは簡単に

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#666666"
 android:orientation="vertical" >
 <TextView
 android:id="@+id/textView1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="1" />
</LinearLayout>

とします。

そしてメインのActivityのOnCreateに

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
Fragment1 frag1 = new Fragment1(); 
fragmentTransaction.replace(R.id.frag, frag1); 
fragmentTransaction.commit();

とかけば、fragmentが表示されます

R.id.frag

は割となんでもいいようで、最初間違えて、fragmentを指定していたのですがfragmentの中にfragmentが入ってしまって、いたので注意ポイントです。

で、例えば、タイマー設定とかして※Fragment2っていう、ほぼ同じfragmentを作成

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
Fragment2 frag2 = new Fragment2();
fragmentTransaction.replace(R.id.frag, frag2); 
fragmentTransaction.commit();

とするとfragmentを上書きしてくれます。fragment1ではonDestoryなども呼ばれます

fragmentTransaction.add()

っていうのを使っているサンプルも多いのですが、これは上に乗せる形になるので、できればメモリ的に避けたいです。replaceを推奨です

で、fragmentを終了させるには

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frag));
fragmentTransaction.commit();

こんな感じで、fragmentの差し替えを行う事をできました。

カテゴリー:fragment

公開中のアプリ、是非ダウンロードしてみてください

2chまとめのたね

RSSを利用してさまざまなブログの情報をキュレーションしてくれるアプリ

インストールする

ひらがな戦記

OPENGL ES2 を利用したカルタのソーシャルゲーム

インストールする