忍者ブログ
2024 04
≪ 2024 03 1 2 3 4 5 67 8 9 10 11 12 1314 15 16 17 18 19 2021 22 23 24 25 26 2728 29 30 2024 05 ≫


*admin*entry*file*plugin| 文字サイズ  

PC系スポンサーリンク







03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
[10/01 mz]
[10/01 天ノ川きらら]
[02/19 mz]
[02/18 天ノ川きらら]
[01/02 mz]
HN: 新堂 瑞樹, mz
性別: 男性
自己紹介:
健康第一

千葉市内一部地域を対象に出張整体やってます
仔細はコチラをご参照あれ

すかいぷ: mizuki_zero
予約等はこちらからも受け付けております
*付きは必須項目です

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。




タッチするたび別のFragmentに切り替え(replace)る

http://qiita.com/dmnlk/items/786840c7d910e59b81dc

 あちゃこちゃ参考にしてるんだが上記記事が決め手となった。同じ内容を過去に別の英語サイト(上記のさらなるリンク先とは異なる)で既に見てたのだが、わかりやすさが違ったせいかね。
 投稿エディタの不具合なのか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



この記事へのコメント

この記事へコメントする








絵文字:
Vodafone絵文字 i-mode絵文字 Ezweb絵文字






この記事へのトラックバック

この記事のトラックバックURL