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メソッドを定義する。
引数をもつコンストラクタでも同じことができますが、推奨されていないようです。(警告がでてしまいます。)