2015-02-17 11 views
8

Mam fragment, który pozwala użytkownikowi wprowadzić wiadomość i numer telefonu, na który wiadomość zostanie dostarczona. Otrzymuję błąd "nie można rozwiązać metody getApplicationContext()" Sprawdziłem odpowiedź tutaj the method getApplicationContext() is undefined ale to mi nie pomogło, może wprowadzam ją źle, ale nie jestem pewien! Ten kod działa dobrze jako działanie, ale nie jako fragment.getApplicationContext() błąd Android

klasy FragmentTab1

package com.androidbegin.absfragtabhost; 

import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.app.Fragment; 
import android.app.Activity; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class FragmentTab3 extends Fragment { 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragmenttab3, container, false); 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.activity_main); 

    sendBtn = (Button) rootView.findViewById(R.id.btnSendSMS); 
    txtphoneNo = (EditText) rootView.findViewById(R.id.editTextPhoneNo); 
    txtMessage = (EditText) rootView.findViewById(R.id.editTextSMS); 

    sendBtn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      sendSMSMessage(); 
     } 
    }); 

    return rootView; 
} 



    Button sendBtn; 
    EditText txtphoneNo; 
    EditText txtMessage; 



    protected void sendSMSMessage() { 
     Log.i("Send SMS", ""); 

     String phoneNo = txtphoneNo.getText().toString(); 
     String message = txtMessage.getText().toString(); 

     try { 
      SmsManager smsManager = SmsManager.getDefault(); 
      smsManager.sendTextMessage(phoneNo, null, message, null, null); 
      Toast.makeText(getApplicationContext(), "SMS sent.", 
        Toast.LENGTH_LONG).show(); 
     } catch (Exception e) { 
      Toast.makeText(getApplicationContext(), 
        "SMS failed, please try again.", 
        Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 


     } 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 


} 

Odpowiedz

32

Sposób getApplicationContext() nie występują w klasie Fragment. Istnieje jednak w klasie Activity, więc można użyć getActivity().getApplicationContext(), aby uzyskać kontekst z obiektu fragmentu. (Zakładając, że fragment jest dołączony do działania, więc zwróci obiekt inny niż zero, co zwykle jest prawdą).

5

Zastosowanie getActivity().getApplicationContext();

0

Zobacz odpowiedź tutaj: using context in fragment.

Po prostu zadzwoń pod numer getActivity(), upewnij się, że nie jest pusty i zadzwoń pod numer getApplicationContext().

1

Należy użyć kontekst aplikacji dostępnej w Działaniu Fragment

getActivity().getApplicationContext(); 

Nie należy używać getActivity() jako kontekst tutaj, ponieważ Toast mogą żyć dłużej niż działalność, która pokazała go (przycisk Home, jak został wciśnięty, inna działalność została uruchomiona, itd.)

http://developer.android.com/guide/topics/ui/notifiers/toasts.html#Basics

0

nie istnieje lub można powiedzieć nie zdefiniowane w klasie Fragment, co oznacza, że ​​nie można uzyskać do niego dostępu bezpośrednio w klasie Fragment.

rozwiązaniem jest więc, że zamiast robić jak ten

Toast.makeText(getApplicationContext(), "SMS sent.",Toast.LENGTH_LONG).show(); 

należy użyć metody getActivity() jak po

Toast.makeText(getActivity().getApplicationContext(), "SMS sent.",Toast.LENGTH_LONG).show(); 

Mam nadzieję, że pomaga.

1

Musisz utworzyć klasę o braku aktywności konstruktor, że trwa kontekst na argumencie, a na swojej klasie działalności, trzeba przekazać kontekst deklaracji obiektu, na przykład:

//ON non activity class : 
public class longcomputingtask extends AsyncTask<Void,Integer,Void> { 

    private Context context ; 

    public longcomputingtask() 
    { 
    } 

    public longcomputingtask(Context context) 
    { 
     this.context=context; 
    } 

// on activity class : 

public Context context; 
context=getApplication().getBaseContext(); 

longcomputingtask calcul =new longcomputingtask(context): 
Powiązane problemy