現在、フラグメントを含むアクティビティがあります
[1]、[2]、[3]、[4]
ボタンを押すと[3]、[4]にリダイレクトできます
次のように戻るボタンを実装したいと思います。
[4]で押すと、[3]に戻ります
[3]で戻ると、[2]に戻ります
[1]を押すと、アクティビティはfinishs();
現在の実装になると、フラグメントをポップアップする代わりにアクティビティを終了します。私が何をすべきか、または心に留めておくべきことを教えてください。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if( keyCode==KeyEvent.KEYCODE_BACK)
{
finish();
}
return super.onKeyDown(keyCode, event);
}
フラグメントを格納するアクティビティのonCreate()で、次のようなバックスタック変更リスナーを追加します。
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
List<Fragment> f = fragmentManager.getFragments();
Fragment frag = f.get(0);
currentFragment = frag.getClass().getSimpleName();
}
});
(Nb。my fragmentManagerはグローバルに宣言されています)フラグメントを変更するたびに、currentFragment文字列が現在のフラグメントの名前になります。次に、onBackPressed()アクティビティで、戻るボタンのアクションを次のように制御できます。
@Override
public void onBackPressed() {
switch (currentFragment) {
case "FragmentOne":
// your code here
return;
case "FragmentTwo":
// your code here
return;
default:
fragmentManager.popBackStack();
// default action for any other fragment (return to previous)
}
}
私はこの方法が私のために働くことを確認できます。
これは私のために働いた。
-アクティビティから新しいフラグメントを呼び出すときに.addToBackStack(null)を追加します。
FragmentTransaction mFragmentTransaction = getFragmentManager()
.beginTransaction();
....
mFragmentTransaction.addToBackStack(null);
-onBackPressed()をアクティビティに追加する
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
this.finish();
} else {
getFragmentManager().popBackStack();
}
}
これまでで最も簡単な方法:
onResume():
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
// handle back button's click listener
Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
編集1:フラグメントがEditText
の場合。
private EditText editText;
onCreateView():
editText = (EditText) rootView.findViewById(R.id.editText);
onResume():
@Override
public void onResume() {
super.onResume();
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
editText.clearFocus();
}
return false;
}
});
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
// handle back button's click listener
Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
注:フラグメントにEditTextがあれば機能します。
完了
これは私にとって実用的なソリューションです:
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// DO WHAT YOU WANT ON BACK PRESSED
return true;
}
return false;
}
});
編集:フラグメントのダイアログをgetView()
に置き換えることができます。
これを使用できます..私のために働いた..
戻るボタンを押してもフラグメント[3]がビューから削除されないように見えるため、手動で行う必要があります。
まず第一に、replace()を使用せず、代わりにremoveとaddを別々に使用します。 replace()が正しく機能しないようです。
これの次の部分は、onKeyDownメソッドをオーバーライドし、戻るボタンが押されるたびに現在のフラグメントを削除することです。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if (getSupportFragmentManager().getBackStackEntryCount() == 0)
{
this.finish();
return false;
}
else
{
getSupportFragmentManager().popBackStack();
removeCurrentFragment();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
public void removeCurrentFragment()
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.f_id);
}
この簡単な解決策を試してください。
アクティビティにonBackPressedを実装します
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
getSupportFragmentManager().popBackStack();
} else {
finish();
}
}
これは、各バックプレスで一番上のフラグメントをポップする場合に機能します。 注:-アクティビティにフラグメントを追加するときは、これが機能するように常にバックスタックにトランザクションを追加してください
この場合に行うことは、アクティビティからonBackPressed()関数を実装することです。
@Override
public void onBackPressed() {
super.onBackPressed();
FragmentManager fm = getSupportFragmentManager();
MyFragment myFragment = (MyFragment) fm.findFragmentById(R.id.my_fragment);
if((myFragmen.isVisible()){
//Do what you want to do
}
}
これもあなたにとってどのように機能するか。
さらに良い解決策は、戻るボタンを押すイベントがアクティブフラグメントからホストアクティビティに伝播されるようなデザインパターンに従うことです。つまり、アクティブフラグメントの1つがバックプレスを消費すると、アクティビティはそれに応じて動作しなくなり、逆も同様です。
それを行う1つの方法は、すべてのフラグメントに、抽象 'boolean onBackPressed()'メソッドを持つベースフラグメントを拡張させることです。
@Override
public boolean onBackPressed() {
if(some_condition)
// Do something
return true; //Back press consumed.
} else {
// Back-press not consumed. Let Activity handle it
return false;
}
}
アクティビティ内のアクティブなフラグメントを追跡し、その中にonBackPressedコールバックがあります
@Override
public void onBackPressed() {
if(!activeFragment.onBackPressed())
super.onBackPressed();
}
}
この投稿には、このパターンの詳細が記載されています
私の問題を解決した方法は、あなたにも役立つと確信しています:
1.フラグメントにテキストボックスが含まれていない場合は、以下のコードを使用できます
ここでMainHomeFragmentはメインフラグメントです(2番目のフラグメントから戻るボタンを押すと、MainHomeFragmentもかかります)
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
Android.support.v4.app.FragmentTransaction fragmentTransaction =
getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
fragmentTransaction.commit();
return true;
}
return false;
}
}); }
2.Somefragmentという名前の別のフラグメントがあり、そのテキストボックスに[編集]テキストボックスがある場合、この方法で実行できます。
private EditText editText;
次に、
onCreateView():
editText = (EditText) view.findViewById(R.id.editText);
次に、OnResumeをオーバーライドします。
@Override
public void onResume() {
super.onResume();
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
editTextOFS.clearFocus();
getView().requestFocus();
}
return false;
}
});
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
Android.support.v4.app.FragmentTransaction fragmentTransaction =
getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
fragmentTransaction.commit();
return true;
}
return false;
}
});
}
それはすべての人(amitamie.com):-);-)
onCreateViewメソッドでこれを使用するよりも、フラグメント内でwebviewを使用している場合
webView.setOnKeyListener(new View.OnKeyListener(){
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if((i==KeyEvent.KEYCODE_BACK)&& webView.canGoBack()){
webView.goBack();
return true;
}
return false;
}
});
このクラスをインポートします
import Android.view.KeyEvent;
基本的なFragment
でgetFragmentManager().popBackStack()
を使用して戻ることができます。
また、Action_DownまたはAction_UPイベントを確認する必要があります。チェックしない場合、onKey()メソッドは2回呼び出します。
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(getActivity(), "Back Pressed", Toast.LENGTH_SHORT).show();
return true;
}
}
return false;
}
});
私にとって非常にうまく機能しています。
以下を必ず追加してください。
if (event.getAction()!=KeyEvent.ACTION_DOWN)
return true;
イベントの2回の呼び出しを回避するために、コードのonKeyブロックで。
メソッドを使用して、次のコードを持つフラグメントを変更します
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit).replace(R.id.content_frame, mContent, mContent.getClass().getSimpleName()).addToBackStack(null)
.commit();
戻るボタンの場合、これ。
@Override
public void onBackPressed() {
// note: you can also use 'getSupportFragmentManager()'
FragmentManager mgr = getSupportFragmentManager();
if (mgr.getBackStackEntryCount() == 1) {
// No backstack to pop, so calling super
finish();
} else {
mgr.popBackStack();
}
}
注意すべき重要なことは、getBackStackEntryCountをチェックするために1を使用することです。これを使用せず、0を使用すると、最後の戻るボタンに何も表示されないためです。