Fragment BackKey の制御
////////////////////backkey listenner
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// onKey 2回呼ばれるのでフィルターが必要
//the first time for key down, and the second time for key up,
if (event.getAction()!=KeyEvent.ACTION_DOWN) return false;
if(keyCode == KeyEvent.KEYCODE_BACK){
finishDialog();
return true;
}
return false;
}
});
//フォーカスをあてる。
view.setFocusableInTouchMode(true);
view.requestFocus();
addでfragmentを重ねる場合、次のfragmentにもフォーカスをあてないと
このバックキーが動くので注意
---------------------------------以下 よくわからないので 無しにする。
transaction.addToBackStack(null); でバックキーの制御できるが、
終了するとき、例えば、
OyaFragmentでバックキー押して、ダイアログで確認メッセージ表示したい場合
OyaFragmentだけ、
iew.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN)
finishDialog();
Log.w(TAG,"on pressed back key");
return false;
}
});
view.setFocusableInTouchMode(true);
view.requestFocus();
でバックキー処理したいけど、view.requestFocus();しないといけない。
これが、子fragment で解除できるけど、子からバックキーで戻った時、onresume も実行されないので、再度view.requestFocus();できない。
そこで、バックキーはすべて、MainActivityで制御。
ただし、transaction.addToBackStack(null); で普通にFragment画面遷移すること。
あとで、BackStackの中身をチェックするから、
まず、MainActivityで、onBackPressed()作成
これで、バックキーイベントはここに集まる。
findFragmentByTagでFragment取得
Fragment nowFragment = fragmentManager.findFragmentById(R.id.f1);
で、今表示中のFragment取得。
FragmentManager.popBackStack();は、普通通りバックキーで戻りなさいの命令。
これで、特定のFragmentのバックキー制御ができる。
あいかわらず、Fragmentに悩まされる。
@Override
public void onBackPressed(){
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment oyaF= fragmentManager.findFragmentByTag("oya");
Fragment koF= fragmentManager.findFragmentByTag("ko");
Fragment inputF= fragmentManager.findFragmentByTag("inputtext");
Fragment nowFragment = fragmentManager.findFragmentById(R.id.f1);
if(nowFragment ==oyaF){
Toast.makeText(MainActivity.this, "oya bkkeyがクリックされました", Toast.LENGTH_SHORT).show();
finishDialog();
}else if(nowFragment ==koF){
Toast.makeText(MainActivity.this, "ko bkkeyがクリックされました", Toast.LENGTH_SHORT).show();
fragmentManager.popBackStack();
}else if(nowFragment == inputF){
fragmentManager.popBackStack();
}
}
private void finishDialog() {
// OkCancelDialog dialogFragment = OkCancelDialog
// .newInstance("自分メモ", "終了します");
OkCancelDialog dialogFragment = OkCancelDialog.newInstance("自分メモ", "終了します");
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
// transaction.replace(R.id.f1, oyaFragment, "oya");
transaction.add(dialogFragment, "dialog");
//transaction.addToBackStack(null);
transaction.commit();//AllowingStateLoss();
dialogFragment.setOnOkClickListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Toast.makeText(MainActivity.this, "OKがクリックされました", Toast.LENGTH_SHORT).show();
finish();
//listener.onFinish();//addkey 表示finish();
}
});
dialogFragment.setOnCancelClickListener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Toast.makeText(MainActivity.this, "Cancelがクリックされました", Toast.LENGTH_SHORT).show();
}
});
}