私はプロジェクトに取り組んでおり、各フラグメントの戻るボタンを使用して前のフラグメント間を移動できるようにする必要があります。アクションバーの戻る矢印を使用して、そのためのメソッドを作成しましたが、押した戻るボタンで同じ機能を使用します。バックスタックを使用したくありません。これを行う方法はありますか?
[〜#〜] 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メソッドを実装できるようにしたいと思います。これは理にかなっていますか?
バックスタックを使用したくないのはなぜですか。根本的な問題や混乱がある場合は、それを解決することができます。
要件を守りたい場合は、アクティビティの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();
}
});
}
私はこの問題について良い答えを見つけられなかったので、これが私の解決策です。
各フラグメントで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();
}
}
}
}
_
戻るボタンを処理するフラグメントでは、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;
}
};
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);
}
フラグメントについては、単に追加することができます
getActivity().onBackPressed();
あなたのコードに