web-dev-qa-db-ja.com

Android FragmentsでonBackPressed()を使用する

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

[〜#〜] edit [〜#〜]

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

前に戻る

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()でgo backメソッドを実装できるようにしたいと思います。これは理にかなっていますか?

24
DJ-DOO

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

要件を守りたい場合は、アクティビティの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();
        }
    });
}
22
tiguchi

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

各フラグメントで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();
           }
        }
    }
}
_
34
Ioane Sharvadze

戻るボタンを処理するフラグメントでは、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;
    }
};
3
user2886881

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

フラグメントについては、単に追加することができます

  getActivity().onBackPressed();

あなたのコードに

2
Chidinma