2014-07-22 16 views
6

Dlaczego getActivity() zwraca wartość null wewnątrz AlertDialog?getActivity() ma wartość null wewnątrz AlertDialog fragmentu

to klasa -

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

Wspólna klasy rozciąga fragmentów jako -

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

a wyjście -

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

Więc która metoda jest kod i gdzie Cykl życia fragmentu to jest? – laalto

+0

@laalto - Zaktualizowano kod. Jest wewnątrz metody 'onCreateView' po kliknięciu przycisku Zapisz. –

Odpowiedz

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

Nie rób tego! Może to spowodować wyciek aktywności. –

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

Dzieje się tak dlatego, że wywołuje się getActivity() z DialogInterface.OnClickListener, a nie jako fragment, co daje wartość zerową.

rozwiązanie:

A.this.getActivity(); 

trzeba zadzwonić odniesienie swojej klasie za pomocą this i wywołać metodę 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 zwraca działanie, które obsługuje fragment, jaka jest różnica? – Blackbelt

+0

@blackbelt wywołuje go wewnątrz anonimowej klasy, która do tego czasu wywoła metodę getactivity, która zwróci wartość null –

+0

To nadal daje taki sam wynik - zero. –

4

myślę getActivity() wewnątrz DialogInterfac e jest skierowany do kontekstu dialogowym

dialog.getActivity() 

wewnątrz swojej DialogInterface spróbuj zmienić go na adres:

A.this.getActivity(); 

Edytuj: Sprawdziłem getActivity() wewnątrz DialogInterface i powinien działać dobrze .

inne rozwiązanie może używać funkcji wywołania zwrotnego onAttach i uzyskać dostęp do kontekstu tam, aby upewnić się, że fragment został dołączony do działania nadrzędnego przed użyciem go w oknie dialogowym. następnie użyj go zamiast getActivity().

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

* wskazuje kontekst okna dialogowego *, domyślam się, że nie, w przeciwnym razie nie będzie mógł zdarzyć się kompilacji – Blackbelt

+0

To nadal daje taki sam wynik - zero. –

+0

@blackbelt: Ty za wspomnienie tego, sprawdziłem, że getActivity() wewnątrz DialogInterface powinien działać poprawnie. –

1

wymienić getActivity() do A.this

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

Błąd czasu kompilacji - 'Konstruktor AlertDialog.Builder (A) jest niezdefiniowany'. –

0

getActivity() zwrotnego NULL aż fragment nie dołączyć do działalności.

należy utworzyć obiekt po wywołaniach metody onAttach.

można utworzyć obiekt w metodzie sprawdzania dobrych praktyk w metodzie onCreateview.

0

Opierając się na Sudhi S i odpowiedzi Arash jest, myślę, że to jest czystsze opcja, która zajmuje się aktywny lokalnie metody nazywając go:

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

To jest duplikat innych odpowiedzi. Proszę wyjaśnić potencjalne zalety, nie tylko wklejać kod. –

Powiązane problemy