2014-07-22 6 views
6

Perché lo getActivity() restituisce null all'interno di AlertDialog?getActivity() è null all'interno di AlertDialog di un frammento

Questa è la classe -

Class A extends Common{ 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     Button save = (Button) view.findViewById(R.id.save); 
     save.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     System.out.println("the activity outside dialog.."+getActivity()); 

     AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); 
     alert.setPositiveButton("Check acitivity", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, 
      int whichButton) { 
      dialog.cancel(); 
      System.out.println("the activity inside dialog.."+getActivity()); 
      } 
     }); 
     } 
} 

La classe comune sta estendendo frammento come -

import android.support.v4.app.Fragment; 
Class Common extends Fragment 
{ 
    //Some code 
} 

e l'uscita è -

the activity outside [email protected] 
the activity inside dialog..null 
+0

Quindi, in cui il metodo è il codice e dove nel è il ciclo di vita del frammento? – laalto

+0

@laalto - Aggiornamento del codice. Si trova all'interno del metodo 'onCreateView' sul pulsante Salva. –

risposta

6
Activity activity; 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    this.activity=activity; 
} 
+0

Non farlo! Questo può far trapelare l'attività. –

1
Why the getActivity() is returning null inside AlertDialog ? 

Questo perché si chiama getActivity() dello DialogInterface.OnClickListener non il frammento in modo da fornire nulla.

soluzione:

A.this.getActivity(); 

è necessario chiamare il riferimento della classe utilizzando il this e chiamare il metodo getActivity()

EDIT:

@Override 
     public void onClick(View v) { 

    System.out.println("the activity outside dialog.."+getActivity()); 

    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); 
    alert.setPositiveButton("Check acitivity", 
    new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, 
     int whichButton) { 
     System.out.println("the activity inside dialog.."+ A.this.getActivity()); 
     dialog.cancel(); 
     } 
    }); 
+0

getActivity restituisce l'attività che ospita il frammento, qual è la differenza? – Blackbelt

+0

@blackbelt lo sta chiamando all'interno della classe anonima che chiamerà quindi il suo metodo getactivity che restituirà null –

+0

Questo sta ancora dando lo stesso risultato - null. –

4

penso getActivity() all'interno di DialogInterfac e sta puntando al contesto di dialogo

dialog.getActivity() 

all'interno del vostro DialogInterface provare a cambiare a:

A.this.getActivity(); 

Edit: Ho controllato il getActivity() all'interno DialogInterface e dovrebbe funzionare bene .

un'altra soluzione potrebbe essere utilizzando onAttach funzione di richiamata e ottenere l'attività Contesto lì per essere sicuri che il frammento collegato all'attività padre prima di utilizzarlo nella finestra di dialogo. quindi usalo invece di getActivity().

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    yourActivity = activity; 
} 
+0

* sta puntando al contesto della finestra di dialogo *, suppongo di no, altrimenti non sarà in grado di compilare l'evento – Blackbelt

+0

Questo sta ancora dando lo stesso risultato - null. –

+0

@blackbelt: per averlo detto, ho controllato che getActivity() all'interno di DialogInterface funzioni correttamente. –

1

sostituire getActivity() per a.Questa

AlertDialog.Builder alert = new AlertDialog.Builder(A.this); 
+0

Errore tempo di compilazione - 'Il costruttore AlertDialog.Builder (A) non è definito. –

0

getActivity() nullo ritorno fino Frammento Non collegare all'attività.

si supponga di creare oggetto dopo le chiamate di metodo onAttach.

è possibile creare l'oggetto nel metodo onCreateview per le migliori pratiche.

0

Sulla Sudhi S e le risposte di Arash, penso che questa è un'opzione più pulito che si occupa della attività a livello locale per il metodo chiamandolo:

private void showDialog() { 
    final Activity activity = getActivity(); 
    AlertDialog.Builder builder = new AlertDialog.Builder(activity) 
      .setTitle(R.string.my_title) 
      .setMessage(R.string.my_message) 
      .setNegativeButton(android.R.string.cancel, null) 
      .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        Log.e(TAG, "the activity inside dialog... " + activity); 
       } 
      }); 
    final AlertDialog dialog = builder.create(); 
    dialog.setCanceledOnTouchOutside(true); 
    dialog.show(); 
} 
-1
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    yourActivity = activity; 
} 
+0

Questo è un duplicato di altre risposte. Si prega di spiegare i potenziali vantaggi, non solo incollare il codice. –