2015-02-17 17 views
8

Ho un frammento che consente a un utente di inserire un messaggio e un numero di telefono al quale verrà recapitato il messaggio. Ricevo un errore "impossibile risolvere il metodo getApplicationContext()" Ho guardato la risposta qui the method getApplicationContext() is undefined ma non mi è stato d'aiuto, forse lo sto implementando male ma non ne sono sicuro! Questo codice funziona bene come attività ma non come un frammento.getApplicationContext() error Android

FragmentTab1 classe

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


} 

risposta

32

Il metodo getApplicationContext() non esiste nella classe Fragment. Esiste, tuttavia, nella classe Activity, quindi è possibile utilizzare getActivity().getApplicationContext() per ottenere il contesto da un oggetto frammento. (Supponendo che il frammento sia associato a un'attività, getActivity() restituirà un oggetto non null, che di solito è vero)

5

Uso getActivity().getApplicationContext();

0

Vedere la risposta qui: using context in fragment.

Basta chiamare getActivity(), assicurarsi che non sia null e chiamare su quello.

1

si dovrebbe usare il contesto applicativo disponibile nel frammento attività

getActivity().getApplicationContext(); 

Si consiglia di non utilizzare il getActivity() come contesto qui perché Toast può vivere più a lungo l'attività che mostrò (tasto Home come stato premuto, un'altra attività è stato lanciato, ecc)

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

0

getApplicationContext() non esisteva o si può dire non definito nella classe Fragment che significa che non è possibile accedervi direttamente all'interno della classe Fragment.

Così soluzione è che invece di fare come questo

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

si dovrebbe utilizzare il metodo getActivity() come seguire

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

spero che aiuta.

1

È necessario creare sulla classe non l'attività di un costruttore che accetta un contesto in argomento, e la classe di attività, è necessario passare il contesto sulla dichiarazione di oggetto, in questo modo:

//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):