ListFragmentからFragmentを表示する方法
ListFragmentのリスト選択時、詳細な情報を別Fragmentで表示したいときがあります。
試行錯誤しながら、なんとか実現できたので備忘録として残しておきます。
ラッパー用のFragmentを容易し、その中にListFragment、およびFragmentを表示する方法になります。
ラッパー用のlayoutファイルfragment_wrapper.xmlは以下のようになります。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout>
ラッパー用のFragmentは以下のようにします。
リスト選択時、getChildFragmentManagerで詳細画面用のFragmentに置き換えます。
public class WrapperFragment extends Fragment { public static WrapperFragment newInstance(int position){ WrapperFragment fragment = new WrapperFragment(); Bundle bundle = new Bundle(); bundle.putInt("position", position); return fragment; } @Override public void onCreate(Bundle savedInstanceState){ logger.put(android.util.Log.INFO,TAG,"onCreate"); super.onCreate(savedInstanceState); DataListFragment list = DataListFragment.newInstance(1,new DataListListener(){ @Override public void onSwitchToNextFragment(){ DetailFragment fragment = DetailFragment.newInstance(1); getChildFragmentManager().beginTransaction() .replace(R.id.container, fragment) .addToBackStack(null) .commit(); } }); getChildFragmentManager().beginTransaction() .add(R.id.container, list) .commit(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ logger.put(android.util.Log.INFO,TAG,"onCreateView"); View view = inflater.inflate(R.layout.fragment_wrapper, container, false); return view; }
DataListFragmentは以下のとおりになります。
@Override public void onListItemClick(ListView l, View v, int position, long id){ ...省略... if(mListener != null) { mListener.onSwitchToNextFragment(); } }
解決するのに時間がかかりました。疲れた。