2016-05-19 4 views
2

私はhereのようなフラグメントの実装を持っています。私は、ナビゲーションアイコンonClickListenerを処理するためにBaseFragmentクラスを拡張しました。私はツールバーアイコンや色を変更するには、コードのこのブロックを使用していますバックプレスでアクティビティにアタッチされていないフラグメント

private void onBackButtonPressed(int tag) 
    { 
     switch (tag) 
     { 
      case Global.DISPLAY_STORE: 
      { 
       setTitle("Loyalty Cards",Color.BLACK); 
       setToolBar(getResources().getColor(R.color.white), Global.ADD_CARD,R.drawable.add_round_btn); 
       break; 

      } 
      case Global.ADD_CARD: 
      { 
       setTitle("Wallet", Color.WHITE); 
       setToolBar(getResources().getColor(R.color.colorPrimary), Global.DISPLAY_STORE,R.drawable.icon_shopping); 
       getFragmentManager().popBackStack(); 
       break; 
      } 
      case Global.CARD_DETAILS: 
      { 
       setTitle("Loyalty Cards",Color.BLACK); 
       setToolBar(getResources().getColor(R.color.white), Global.ADD_CARD,R.drawable.add_round_btn); 
       getFragmentManager().popBackStack(); 
       break; 
      } 
     } 

    } 

バックボタンがpressed.ThisコードがBaseFragmentに常駐しているとき、そのためのコードは、次のようになります。ここで

は、私は、私はこのコードを持っているBaseFragmentのonCreate内で今BaseFragment

public class CardDetailsFragment extends BaseFragment 

を拡張し、私のフラグメントを持って、

を押して戻って処理するコードを実装する方法です

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mainActivity = (MainActivity) getActivity(); 

     ImageButton righBarButton = (ImageButton) mainActivity.getToolbar().findViewById(R.id.btn_ToolBarRightBtn); 
     righBarButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onRighBarButtonClicked(Integer.parseInt(v.getTag().toString())); 
      } 
     }); 

     mainActivity.getToolbar().setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackButtonPressed(BACK_BUTTON_TAG); 
      } 
     }); 

     getFragmentManager().addOnBackStackChangedListener(this); 

     shouldDisplayHomeUp(); 
    } 

これにより、すべてのフラグメントバックボタンと、ツールバー内の右のバーボタンアイテムのクリックが処理されます。私はフラグメントAIオープンフラグメントBから3つの断片A、BおよびCの

を持っており、そして、断片C.今すぐフラグメントCIからのフラグメントBをバックボタンイベントをされて到達するために[戻る]ボタンをクリックしてシナリオを検討して

上記のコードで処理され、正常に動作します。フラグメントBから今

私は例外

java.lang.IllegalStateException: Fragment CardDetailsFragment{d8b35b5} not attached to Activity 
                        at android.support.v4.app.Fragment.getResources(Fragment.java:636) 

を取得しています戻るボタンをクリックしたときに、私はフラグメントA.に到達するために戻るボタンをクリックしてくださいしかし、ここでCardDetailsFragmentがFragmentCですが、私はをクリックしています フラグメントBからの戻るボタン

+0

フラグメントは 'onBackButtonPressedを()'を呼び出すためにイベントを得ている方法は? –

+0

pstを更新しました – Zach

+0

フラグメントのインスタンスをバックスタックに格納し、バックプレスにロードしようとしました –

答えて

0

最初にユーザーが戻るボタンを押すと、フラグメントCはもはや必要なくなり、アクティビティーから切り離されます。問題は、フラグメントCが切り離されても、バックスタック変更イベントのリスナーとして登録されているという事実にあります。

2回目に戻るボタンを押すと、onBackStackPressed()メソッドがフラグメントCで呼び出されます。getResources()が実行されると、アクティビティの添付ファイルが存在しないため、getResources()は失敗します。あなたのフラグメントでこのよう

何かがそれを修正する必要があります

 @Override 
    public void onDestroy() { 
     getFragmentManager().removeOnBackStackChangedListener(this); 
     super.onDestroy(); 
    } 
関連する問題