3

Ich entwickle Android-Kartenspiel, und ich benutze DialogFragment, wo ich einige Bilder rendern und dem Spieler sagen, gegen den Gegner zu handeln.android DialogFragment mDialog ist null Ursache Ausnahme

das folgende Stück Code wird oft ohne Fehler ausgeführt, aber nach sagen wir 5 bis 10 mal die folgende Ausnahme aufgetreten ist.

E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.arabdealgame.arabdealgame, PID: 8359 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.Dialog.setOwnerActivity(android.app.Activity)' on a null object reference 
                       at android.app.DialogFragment.onActivityCreated(DialogFragment.java:482) 
                       at com.arabdealgame.activities.dialog.RentCardDialog.onActivityCreated(RentCardDialog.java:342) 
                       at android.app.Fragment.performActivityCreated(Fragment.java:2362) 
                       at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1014) 
                       at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171) 
                       at android.app.BackStackRecord.run(BackStackRecord.java:815) 
                       at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578) 
                       at android.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:563) 
                       at com.arabdealgame.bo.Actions.RentActionCard$5.run(RentActionCard.java:315) 
                       at android.os.Handler.handleCallback(Handler.java:751) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6077) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

die obige Ausnahme ist bezeichnend, dass im Inneren android.app.DialogFragment mDialog an der Linie mDialog.setContentView (view) null ist;

android.app.DialogFragment

public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     if (!mShowsDialog) { 
      return; 
     } 

     View view = getView(); 
     if (view != null) { 
      if (view.getParent() != null) { 
       throw new IllegalStateException("DialogFragment can not be attached to a container view"); 
      } 
      mDialog.setContentView(view); 
     } 
     mDialog.setOwnerActivity(getActivity()); 

ich von hier den Dialog am Instanziieren der Fehler bei

boolean executePendingTransactions = fm.executePendingTransactions auftreten(); die ich hinzugefügt, wie in einem verwandten Beitrag vorgeschlagen, um das Problem zu beheben. bevor diese Anweisung des Hinzufügen der Fehler ohne Angabe von Klasse unter meinem Paket auftritt

RentActionCard.java

getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       MyLog.i(TAG, "run: --------------------------1"); 
       FragmentManager fm = getActivity().getFragmentManager(); 
       MyLog.i(TAG, "run: --------------------------2"); 
       RentCardDialog rentCardDialog = new RentCardDialog(); 
       MyLog.i(TAG, "run: --------------------------3"); 
       if (!GameInfo.getCurrentPlayer().isUser()) { 
        MyLog.i(TAG, "run: --------------------------4"); 
        rentCardDialog.setAgainstUser(true); 
       } 
       rentCardDialog.show(fm, "ccc"); 
       boolean executePendingTransactions = fm.executePendingTransactions(); 
       MyLog.d(TAG, "RentActionCard - executePendingTransactions : " + executePendingTransactions); 
       MyLog.i(TAG, "run: --------------------------5"); 
      } 
     }); 

diese Methode für die Fehlersuche in meinem Dialog

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     MyLog.i(TAG, "onActivityCreated: ----------------------------------"); 
     super.onActivityCreated(savedInstanceState); 
    } 
+0

Mögliche Duplikate von [Was ist eine NullPointerException, und wie behebe ich es?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) –

+0

es ist keine Lösung für meinen Fall, da die Ausnahme innerhalb der Android-Bibliothek passiert nicht mein Code – mhmdawwad

+0

können Sie ein Snippet von, wenn Sie Ihre 'mDialog' Variable initialisieren? – payloc

Antwort

0

außer Kraft gesetzt wurde Diese Ausnahme wird nicht mehr angezeigt, indem Sie Folgendes tun:

  1. erklärte ich alle componenet als Feldelement eher lokale Variablen

    public class RentCardDialog extends DialogFragment { 
    
    private static final String TAG = "RentCardDialog"; 
    
    private TextView title1; 
    private TextView title2; 
    private TextView title1TxtView; 
    private TextView title2TxtView; 
    
  2. dann initialisieren sie nur innerhalb onCreateView wie

    folgt
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    
    View rootView = inflater.inflate(R.layout.dialog_rent_card, container, false); 
    
    title1 = (TextView) rootView.findViewById(R.id.rent_card_dialog_title1); 
    title2 = (TextView) rootView.findViewById(R.id.rent_card_dialog_title2); 
    title1TxtView = (TextView) rootView.findViewById(R.id.rent_card_dialog_title1); 
    title2TxtView = (TextView) rootView.findViewById(R.id.rent_card_dialog_title2); 
    
  3. Schließlich, was Fragment ich hinzufügen, ich will, und tun die gesamte Dialogkomponente, die sich innerhalb onActivityCreated wie folgt entwickelt

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
    
    super.onActivityCreated(savedInstanceState); // Will now complete and not crash 
    
    try { 
        buildUserOptions(); 
        MyLog.i(TAG, "onCreateView: ---------------------------3"); 
    
        player2Fragment.setExecuteCallback(new CallbackInterface() { 
         @Override 
         public void execute() { 
          player2Fragment.refreshPlayerData(player2); 
         } 
        }); 
    

Bevor das Geschäft Arbeit im Inneren des onCreateView war der Dialog so wahrscheinlich das Problem einige Komponente war wirklich noch nicht speziell auf die Fragmente geladen, so dass es diese Ausnahme ausgelöst wird, arbeitet die folgende

nun, indem sie es perfekt .