44

現在、フラグメントを含むアクティビティを実行しています

[1]、[2]、[3]、[4]

ボタン 、 [3] を押すと、[4] にリダイレクトできます。

次のように戻るボタンを実装したいと思います..

[4] を押し戻すと [3] に戻ります

[3] を押し戻すと [2] に戻ります

[1] を押すと、アクティビティは終了します();

現在の実装になると、フラグメントをポップアップする代わりにアクティビティを終了します。何をすべきか、または心に留めておくべきか教えてください。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if( keyCode==KeyEvent.KEYCODE_BACK) 
    {   

        finish();
    }       

        return super.onKeyDown(keyCode, event); 

}   
4

17 に答える 17

92

これは私にとってはうまくいきました。

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

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

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

    @Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    } else {
        getFragmentManager().popBackStack();
    }
}
于 2014-02-07T18:53:00.733 に答える
61

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

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 がある場合に機能します。

終わり

于 2014-11-26T09:04:43.680 に答える
9

これは私にとって有効な解決策です:

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()ダイアログをfor fragmentに置き換えることができます。

于 2014-10-05T22:44:50.713 に答える
8

あなたはこれを使うことができます..私のために働いた..

バックを押してもフラグメント [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);
}
于 2013-09-12T05:05:47.363 に答える
5

Fragmentで戻るボタンを押すか処理するためのソリューション。

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

1.フラグメントに編集テキストボックスがない場合は、以下のコードを使用できます

ここで MainHomeFragment はメイン Fragment です (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 という名前の別のフラグメントがあり、それに Edit テキストボックスがある場合は、この方法でそれを行うことができます。

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

于 2016-09-04T18:31:01.300 に答える
4

この場合、Activity から 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
   }
}

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

于 2015-02-06T23:40:09.093 に答える
4

さらに良い解決策は、戻るボタンを押すイベントがアクティブなフラグメントからホスト アクティビティに伝達されるような設計パターンに従うことです。つまり、アクティブなフラグメントの 1 つがバックプレスを消費すると、アクティビティはそれに基づいて動作しなくなり、その逆も同様です。

これを行う 1 つの方法は、すべての Fragments が、抽象的な「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();
   }
}

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

于 2014-10-01T14:20:18.677 に答える
3

戻るためgetFragmentManager().popBackStack()に基本的に使用できます。Fragment

于 2013-09-12T05:09:17.240 に答える
2

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

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

于 2014-07-22T07:22:07.087 に答える
1

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

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

コードの onKey ブロックで、イベントが 2 回呼び出されるのを回避します。

于 2015-12-24T21:27:01.577 に答える