2015年2月9日月曜日

FragmentとActivityの連携について

WEB上でFragmentについて検索すると、関連する内容がたくさんヒットするのですが、残念なことに、日本語による関連サイトが余りにも少ないのが現状です。
そこで、今回は、今更の感はございますが、Fragmentについて、その中でも特に情報が少ないFragmentとActivityの連携についてまとめてみました。

■Fragmentから特定のActivityと連携する場合

①FragmentからActionBarを操作する

まず、FragmentクラスのgetActivity()メソッドによって、Fragmentが関連付けられているActivityのインスタンスを取得します。

public final Activity getActivity ()
--------------------
[Returns]
Return the Activity this fragment is currently associated with.
--------------------

次に、ActivityクラスのgetActionBar ()メソッドによって、ActionBarのインスタンスを取得します。

public ActionBar getActionBar ()
--------------------
[Returns]
The Activity's ActionBar, or null if it does not have one.
--------------------

以下のようなメソッドを用意しておくと便利です。

private ActionBar getActionBar() {
    return getActivity().getActionBar();
}

ActionBarクラスのメソッドで、以下のような操作が出来ます。

・アプリアイコンをHomeボタンとする。
actionBar.setHomeButtonEnabled(true);

・アプリアイコンの左に戻るアイコンを追加する。
actionBar.setDisplayHomeAsUpEnabled(true);

・タイトル(サブタイトル)を表示する。
actionBar.setDisplayShowTitleEnabled(true);

・タイトルを設定する。
actionBar.setTitle(int resId);

・サブタイトルを設定する。
actionBar.setSubtitle(int resId);


②FragmentからActivityのメソッドを呼び出す

onAttachメソッドで取得したインスタンスは、Fragmentが関連付けられているActivityのインスタンスなので、このインスタンスからメソッドを呼び出す。

public class MainActivity extends Activity {
   
    ---
   
    public void onSectionAttached(int number) {
        switch (number) {
            case 1:
                mTitle = getString(R.string.title_section1);
                break;
            case 2:
                mTitle = getString(R.string.title_section2);
                break;
            case 3:
                mTitle = getString(R.string.title_section3);
                break;
        }
    }

   ---

    public static class PlaceholderFragment extends Fragment {
     
       ----

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
           
            // MainActivity型でキャストして、onSectionAttachedメソッドを呼び出す
            ((MainActivity) activity).onSectionAttached(
                    getArguments().getInt(ARG_SECTION_NUMBER));
        }
       
    }

}





■Fragmentから任意のActivityと連携する場合

Activityにインタフェースでメソッドを実装して、このメソッドをFragmentから呼び出すことで連携することが出来ます。

public class HeadlinesFragment extends ListFragment {
   
    // OnHeadlineSelectedListenerインタフェース型のメンバ変数
    private OnHeadlineSelectedListener mCallback;
   
    // OnHeadlineSelectedListenerインタフェースの宣言
    public interface OnHeadlineSelectedListener {
        // onArticleSelectedメソッドの宣言
        public void onArticleSelected(int position);
    }
   
   
    ---
   
   
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
       
        try {
            // OnHeadlineSelectedListenerインタフェース型でキャスト
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
   
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // 実装先のメソッドを呼び出す
        mCallback.onArticleSelected(position);
       
        // Set the item as checked to be highlighted when in two-pane layout
        getListView().setItemChecked(position, true);
    }
   
}


public class MainActivity extends FragmentActivity implements HeadlinesFragment.OnHeadlineSelectedListener {

    ---
 
    // onArticleSelectedメソッドの実装
    public void onArticleSelected(int position) {
     
       ---
     
    }

}

参考サイト:http://developer.android.com/training/basics/fragments/communicating.html


0 件のコメント:

コメントを投稿