2016-05-19 19 views
2

Ich habe eine Implementierung von Fragment wie here erläutert. Ich habe die BaseFragment-Klasse erweitert, um das Navigationssymbol onClickListener zu behandeln. Der Code für das wie folgt aussieht,Fragment bei Aktivität nicht an Aktivität angefügt

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

    } 

ich diesen Codeblock bin mit der Symbolleiste und Farben zu ändern, wenn wieder Taste pressed.This Code befindet sich in BaseFragment ist.

Hier ist, wie ich den Code implementieren Presse zu behandeln zurück,

Ich habe meine Fragment, das das BaseFragment erstreckt

public class CardDetailsFragment extends BaseFragment 

Jetzt in der BaseFragment onCreate ich diesen Code haben,

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

Dadurch wird jede Fragmentierung zurück Knopfdruck und die rechte Leiste Knopf klicken in der Symbolleiste behandelt.

das Szenario vor Ich habe drei Fragmente A, B und C.

Von Fragmente AI offen Fragment B und dann Fragment C. Jetzt ab Fragment CI klicken Sie auf die Schaltfläche Zurück Fragment B. Das Zurück-Taste Ereignis zu erreichen ist von oben genannten Code behandelt und es funktioniert gut.

Jetzt von Fragment B, ich auf die Zurück-Taste Fragment A zu erreichen Aber wenn ich klicken zurück erhalte ich Ausnahme

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

hier ist die CardDetailsFragment die FragmentC, aber ich Sie auf den Button zurück-Taste von Fragmente B

+0

Wie wird das Fragment, das das Ereignis immer 'onBackButtonPressed()' anrufen? –

+0

Ich habe die PST – Zach

+0

aktualisiert Versuchen Sie, Instanz des Fragments im Back-Stack zu speichern und laden Sie es auf der Rückseite drücken –

Antwort

0

erstes Mal der Benutzer die zurück-Taste drücken, Fragment C ist nicht mehr notwendig, und daher ist es aus der Tätigkeit abgelöst. Das Problem liegt in der Tatsache, dass obwohl Fragment C getrennt ist, es immer noch als Listener für Backstack-Change-Ereignisse registriert ist.

Wenn der Benutzer das zweite Mal die Zurück-Taste drückt, wird Ihre onBackStackPressed()-Methode in Fragment C aufgerufen. Wenn getResources() ausgeführt wird, gibt es keine Aktivität Anhang, so getResources() schlägt fehl.

So etwas wie dies in Ihrem Fragmente soll es beheben:

 @Override 
    public void onDestroy() { 
     getFragmentManager().removeOnBackStackChangedListener(this); 
     super.onDestroy(); 
    }