タッチするたび別のFragmentに切り替え(replace)る
2016/01/05 14:49:56
http://qiita.com/dmnlk/items/786840c7d910e59b81dc
あちゃこちゃ参考にしてるんだが上記記事が決め手となった。同じ内容を過去に別の英語サイト(上記のさらなるリンク先とは異なる)で既に見てたのだが、わかりやすさが違ったせいかね。
投稿エディタの不具合なのかpreタグなんぞ使ってるせいかレイアウトガタガタだがご容赦を。
とりあえずActivityから最初のフラグメントを呼び出す。cntnはカントン包茎ではなくてコンテナ。
setContentView()ではR.layoutで指定してaddではR.idだもんだからわかりづらいがモノは同一。こういうの、自分みたいな初心者の混乱を招く種だと思う。
で、最初のフラグメント側でタッチリスナー作成。第二のフラグメントへreplace. cntn(FrameLayout)という箱の中身をFirstFragmentからSecondFragmentへ入れ替える作業。
SecondFragmentでも同様の処理を書き、replaceのターゲットをFirstFragmentにする。もちろん必要に応じて別のFragmentへ移せばよい。
アクティビティですべてのFragmentに対応するタッチイベントを組むのもできるが、各Fragmentの状態――現在アクティブなFragmentはどれか、など――をActivity側で把握する必要が発生する。
追記:
FrameLayoutのタッチイベントを処理しているが、このやり方で統一するとどうやらアクティブでないFragmentがタッチイベントを受け取りわやになる可能性があるので、フツーに各Fragmentの擁するレイアウト(上記例ではactivity_mainとactivity_sub)のタッチイベントをあれこれするのがよさそうだ。
あちゃこちゃ参考にしてるんだが上記記事が決め手となった。同じ内容を過去に別の英語サイト(上記のさらなるリンク先とは異なる)で既に見てたのだが、わかりやすさが違ったせいかね。
投稿エディタの不具合なのかpreタグなんぞ使ってるせいかレイアウトガタガタだがご容赦を。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frame);
if (savedInstanceState == null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment f = new FirstFragment();
ft.add(R.id.cntn, f);
ft.commit();
}
}
とりあえずActivityから最初のフラグメントを呼び出す。cntnはカントン包茎ではなくてコンテナ。
setContentView()ではR.layoutで指定してaddではR.idだもんだからわかりづらいがモノは同一。こういうの、自分みたいな初心者の混乱を招く種だと思う。
で、最初のフラグメント側でタッチリスナー作成。第二のフラグメントへreplace. cntn(FrameLayout)という箱の中身をFirstFragmentからSecondFragmentへ入れ替える作業。
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_main, container, false);
}
@Override
public void onStart() {
super.onStart();
FrameLayout fl = (FrameLayout)getActivity().findViewById(R.id.cnt);
fl.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.cntn, new SecondFragment());
ft.commit();
break;
}
return false;
}
});
}
SecondFragmentでも同様の処理を書き、replaceのターゲットをFirstFragmentにする。もちろん必要に応じて別のFragmentへ移せばよい。
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.activity_sub, container, false);
}
@Override
public void onStart() {
super.onStart();
FrameLayout fl = (FrameLayout)getActivity().findViewById(R.id.cnt);
fl.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.cntn, new FirstFragment());
ft.commit();
return false;
}
});
}
アクティビティですべてのFragmentに対応するタッチイベントを組むのもできるが、各Fragmentの状態――現在アクティブなFragmentはどれか、など――をActivity側で把握する必要が発生する。
追記:
FrameLayoutのタッチイベントを処理しているが、このやり方で統一するとどうやらアクティブでないFragmentがタッチイベントを受け取りわやになる可能性があるので、フツーに各Fragmentの擁するレイアウト(上記例ではactivity_mainとactivity_sub)のタッチイベントをあれこれするのがよさそうだ。
PR
この記事へのトラックバック
この記事のトラックバックURL