アプリ作って海外移住

コピペプログラマーのメモ

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();

}
});


}