26

私はプロジェクトに取り組んでおり、各フラグメントの戻るボタンを使用して前のフラグメント間を移動できるようにする必要があります。アクションバーの戻る矢印を使用してそうするように記述されたメソッドがありますが、できるようにしたいです押した戻るボタンで同じ機能を使用するには。バックスタックを使いたくありません。これを行う方法はありますか?

編集

バックスタックを使用するのではなく、ユーザーが戻るボタンをクリックしたときに、前のメソッドに戻るを呼び出すことができるようにしたいと考えています。フラグメント内で gobackpressed メソッドを使用する必要があります。これは可能ですか?これが明確かつ簡潔であることを願っています。上記で生じた混乱についてお詫び申し上げます。

前に戻る

public void gobackToPreviousFragment(String preFragmentTag, Fragment preFragment){

    FragmentManager  fm = getSupportFragmentManager();

    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.animator.close_slide_in,R.animator.close_slide_out);

    ft.show(preFragment);

    //**BY REMOVING FRAGMENT, WHEN USER TRIES TO REVISIT, FRAGMENT IS BLACK**

    ft.remove(fm.findFragmentByTag(Misc.currentContentFragmentTag));
    ft.addToBackStack(null);
    ft.commit();

    Misc.currentContentFragmentTag = preFragmentTag;

    createBar(preFragment);
}

前進する

public void gotoNextFragment(String nextTag, Fragment nextFragment){

    FragmentManager  fm = getSupportFragmentManager();

    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.animator.enter_slide_in, R.animator.enter_slide_out);

    boolean newlyCreated = false;
    if(nextFragment == null){
        nextFragment = Fragment.instantiate(this, nextTag);
        newlyCreated = true;
    }

    //hide current fragment
    ft.hide(fm.findFragmentByTag(Misc.currentContentFragmentTag));

    if(newlyCreated){
        ft.add(R.id.content_frame, nextFragment, nextTag);
    }
    else{
        ft.show(nextFragment);
    }

    ft.addToBackStack(null);
    ft.commit();
    Misc.currentContentFragmentTag = nextTag;

    createBar(nextFragment);
}

これらは私が前後にナビゲートする方法であり、onBackPressed() に戻るメソッドを実装できるようにしたいと考えています。これは理にかなっていますか?

4

9 に答える 9

35

この問題について良い答えが見つからなかったので、これが私の解決策です。

各フラグメントで backPress を取得する場合は、次のようにします。

インターフェイスを作成するOnBackPressedListener

public interface OnBackPressedListener {
    void onBackPressed();
}

通知が必要な各フラグメントがbackPress このインターフェースを実装していること。

親アクティビティでは、オーバーライドできますonBackPressed()

@Override
public void onBackPressed() {
    List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
    if (fragmentList != null) {
        //TODO: Perform your logic to pass back press here
        for(Fragment fragment : fragmentList){
           if(fragment instanceof OnBackPressedListener){
               ((OnBackPressedListener)fragment).onBackPressed();
           }
        }
    }
}
于 2015-08-11T13:49:16.620 に答える
24

バックスタックを使いたくないのはなぜですか?根本的な問題や混乱がある場合は、解決できるかもしれません。

要件に固執したい場合は、Activity の onBackPressed() メソッドをオーバーライドし、ActionBar の戻る矢印がクリックされたときに呼び出しているメソッドを呼び出すだけです。

編集:「黒い画面」フラグメントのバックスタックの問題を解決する方法:

バックスタック リスナーをフラグメント マネージャーに追加することで、この問題を回避できます。そのリスナーは、フラグメント バック スタックが空であるかどうかを確認し、それに応じてアクティビティを終了します。

アクティビティの onCreate メソッドでそのリスナーを設定できます。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FragmentManager fm = getFragmentManager();
    fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if(getFragmentManager().getBackStackEntryCount() == 0) finish();
        }
    });
}
于 2013-08-12T14:54:55.407 に答える
3

戻るボタンを処理したいフラグメントでは、 oncreateview のビューに何かを添付する必要があります

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.second_fragment, container, false);
    v.setOnKeyListener(pressed);
    return v;
}



@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    if( keyCode == KeyEvent.KEYCODE_BACK ){
            // back to previous fragment by tag
            myfragmentclass fragment = (myfragmentclass) getActivity().getSupportFragmentManager().findFragmentByTag(TAG);
            if(fragment != null){
                (getActivity().getSupportFragmentManager().beginTransaction()).replace(R.id.cf_g1_mainframe_fm, fragment).commit();
            }
            return true;
        }
        return false;
    }
};
于 2013-10-16T14:49:45.593 に答える
2

フラグメントの場合は、単純に追加できます

  getActivity().onBackPressed();

あなたのコードに

于 2017-07-10T14:19:24.843 に答える
2

オーバーライドonCreateAnimation、パラメーター、およびキャッチを試すことができますenter==false。これは、すべてのバックプレスの前に発火します。

@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {            
        if(!enter){
            //leaving fragment
            Log.d(TAG,"leaving fragment");
        }
        return super.onCreateAnimation(transit, enter, nextAnim);
    }
于 2014-01-23T09:55:10.070 に答える
1

インターフェイスなしでそれを行う新しい方法を見つけました。Fragment の onCreate() メソッドに以下のコードを追加するだけです。

//overriding the fragment's oncreate 
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //calling onBackPressedDispatcher and adding call back

        requireActivity().onBackPressedDispatcher.addCallback(this) {

      //do stuff here
            
        }
    }
于 2020-08-18T05:58:47.847 に答える