HelloFragment/src/com.example.hellofragment/LeftFragment.java
package com.example.hellofragment; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; public class LeftFragment extends ListFragment { private String[] list = new String[] { "Google", "Yahoo", "Bing", "MSN", "goo" }; private String[] url = new String[] { "http://www.google.co.jp/", "http://www.yahoo.co.jp/", "http://www.bing.com/", "http://jp.msn.com/", "http://www.goo.ne.jp/" }; public interface OnSearchEngineSelectedListener { public void onSearchEngineSelected(String uri); } private OnSearchEngineSelectedListener listener; @Override public void onAttach(Activity activity) { super.onAttach(activity); listener = (OnSearchEngineSelectedListener) activity; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); setListAdapter(adapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { listener.onSearchEngineSelected(url[position]); } }
17~19行目:OnSearchEngineSelectedListenerインタフェースを作り、コールバックメソッドを定義する。
上記インタフェースを使い、LeftFragmentとRightFragment間のデータ連携を行う。インタフェースはMainActivityに実装しておく。
23~27行目:onAttach()メソッドをオーバーライドし、Activityオブジェクトをキャストしたものを
OnSearchEngineSelectedListenerオブジェクトとして取得する。
38~41行目:onListItemClick()メソッドをオーバーライドし、ListViewをタップしたときの処理を記述する。
ここでは、上記で取得したOnSearchEngineSelectedListenrオブジェクトのメソッドを呼び出す処理をしている。
この結果、LeftFragmentとMainActivityがリスナーによって連携したことになります。
MainActivityをOnSearchEngineSelectedListenerオブジェクトにキャスト
→LeftFragmentのItemをタップ(onListItemClick()コールバックメソッドが呼ばれる)
→MainActivityのonSearchEngineSelected()メソッドを呼び出される
→RightFragment(WebView)のURLが切り替わる
HelloFragment/src/com.example.hellofragment/RightFragment.java
package com.example.hellofragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; public class RightFragment extends Fragment { public static RightFragment newInstance(String url) { RightFragment fragment = new RightFragment(); Bundle args = new Bundle(); args.putString("url", url); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.right_fragment, container, false); if (getArguments() != null) { String url = getArguments().getString("url"); WebView web = (WebView) v.findViewById(R.id.webView1); web.loadUrl(url); } return v; } }
11~19行目:RightFragment(WebViewをもつFragment)をインスタンス化する際に、
表示するURL指定する必要があるためstaticメソッドを定義する。
引数をもつコンストラクタでも同じことができますが、推奨されていないようです。(警告がでてしまいます。)