web-dev-qa-db-ja.com

フラグメントの戻るボタンを押す

現在、フラグメントを含むアクティビティがあります

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

}   
39
Raju yourPepe

フラグメントを格納するアクティビティの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)
    }

}

私はこの方法が私のために働くことを確認できます。

3
Haider Malik

これは私のために働いた。

-アクティビティから新しいフラグメントを呼び出すときに.addToBackStack(null)を追加します。

    FragmentTransaction mFragmentTransaction = getFragmentManager()
                .beginTransaction();
    ....
    mFragmentTransaction.addToBackStack(null);

-onBackPressed()をアクティビティに追加する

    @Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    } else {
        getFragmentManager().popBackStack();
    }
}
88
Kamel

これまでで最も簡単な方法:

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があれば機能します。

完了

54
Hiren Patel

これは私にとって実用的なソリューションです:

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()に置き換えることができます。

9
savepopulation

これを使用できます..私のために働いた..

戻るボタンを押してもフラグメント[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);
}
8
Piyush

この簡単な解決策を試してください。

アクティビティにonBackPressedを実装します

 @Override
    public void onBackPressed() {
       if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
            getSupportFragmentManager().popBackStack();
        } else {
            finish();
        }
    }

これは、各バックプレスで一番上のフラグメントをポップする場合に機能します。 :-アクティビティにフラグメントを追加するときは、これが機能するように常にバックスタックにトランザクションを追加してください

7
hitesh

この場合に行うことは、アクティビティから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
   }
}

これもあなたにとってどのように機能するか。

4
Jesus Almaral

さらに良い解決策は、戻るボタンを押すイベントがアクティブフラグメントからホストアクティビティに伝播されるようなデザインパターンに従うことです。つまり、アクティブフラグメントの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();
   }
}

この投稿には、このパターンの詳細が記載されています

4
Achin Kumar

フラグメントの戻るボタンを押すまたは処理するためのソリューション。

私の問題を解決した方法は、あなたにも役立つと確信しています:

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

4
Amit Kumar

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;
3
Akshansh Jain

基本的なFragmentgetFragmentManager().popBackStack()を使用して戻ることができます。

3
Denny

また、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;
            }
        });

私にとって非常にうまく機能しています。

2
Tejas Mehta

以下を必ず追加してください。

if (event.getAction()!=KeyEvent.ACTION_DOWN)
                return true;

イベントの2回の呼び出しを回避するために、コードのonKeyブロックで。

1
mossman252

メソッドを使用して、次のコードを持つフラグメントを変更します

 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を使用すると、最後の戻るボタンに何も表示されないためです。

0
kamran hatami