2012-07-31 13 views
17

Ho un'attività che fa una transazione frammentoAndroid: Frammento non può ottenere l'attività

DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

che funziona bene. Ora so che all'interno della mia attività ho bisogno di una stringa dinamica da sostituire nel layout che ho in newFragment. Ho pensato che posso chiamare dopo transaction.commit() proprio qualcosa di simile

newFragment.setMyString("my dynamic value"); 

E nel newFragment.java ho

public void setMyString(String s) 
{ 
TextView tv = (TextView) getActivity().findViewById(R.id.myobject); 
tv.setText(s); 
} 

Il punto è che getActivity() restituisce null. Come posso ottenere il contesto di cui ho bisogno per trovare i miei elementi di layout?

Edit:

cerco di seguire il percorso utilizzando un fascio come questo sembra essere il modo più pulito. Così ho cambiato il mio codice:

Bundle b = new Bundle(); 
b.putString("text", "my dynamic Text"); 
DetailFragment newFragment = new DetailFragment(); 
transaction.replace(R.id.mylist, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

mio frammento onCreateView assomiglia a questo:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View v = inflater.inflate(R.layout.mylayout, container, false); 
    TextView t = (TextView) v.findViewById(R.id.texttobereplaced); 
    t.setText(savedInstanceState.getString("text"); 
} 

Sembra che savedInstranceState è vuoto. Dove dovrei trovare il mio pacchetto?

Edit2:

perse le getArguments() nella risposta. sta funzionando ora.

risposta

17

tuo Fragment non ha ancora attaccato al Activity, che significa anche il layout hasn 'stato gonfiato ancora (Vedi il Fragment lifecycle). La soluzione migliore sarebbe quella di aggiungere il valore String come argomento allo Fragment tramite il metodo Fragment.setArguments(Bundle). Questo può essere recuperato nel Fragment ricevente tramite il metodo Fragment.getArguments().

+1

Il mio layout è gonfiato quando viene chiamatoViewCreated. Posso vedere il mio layout. – AndyAndroid

2

Così Inoltre sto usando lo stesso gestore delle transazioni frammento e l'unico problema che posso vedere con il codice è che si definisce la tv TextView all'interno del vostro metodo di onCreateView della classe newFragment e poi un'istanza come in questo modo:

public class AboutFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.newFragment, container, false); 
     TextView tv = (TextView) v.findViewById(R.id.textview); 
     return v; 
    } 

    public void setMyString(String s) { 
     tv.setText(s); 
    } 
} 

so does'nt fare davvero molto senso, ma è così che sto facendo funzionare il mio codice e funziona benissimo :)

+0

dispiace did'nt sapere che era così importante :) cambiato ..hopefully sembra meglio ora – Android2390

+3

Naturalmente Indentare il codice è importante su StackOverflow ... le persone non stanno andando a pensare che sono una fonte molto credibile se il vostro il codice è palesemente illeggibile. Ho appena modificato la tua risposta e rimosso il downvote. –

20

Assicurati di chiamare getActivity() in o dopo onAttach(), come prima di allora tornerà null.

+0

scusa, non capisco dove chiamerò getActivity() e lo passerò alla mia funzione setMyString(). E se lo faccio dove suggerisci di scrivere, potrebbe o non restituire nulla. Come posso capire questo? – AndyAndroid

+6

Il 'Fragment' sarà collegato a un'attività' null' finché 'onActivityCreated' ... cioè, se si chiama' getActivity() 'in' onCreate' o 'onCreateView', restituirà' null' perché ' Activity' non è stata ancora creata. Quindi assicurati di avere tutte le tue chiamate a 'getActivity()' * in o dopo * 'onActivityCreated'. –

+4

Questo è sbagliato. Una volta onAttach è chiamato getActivity() può essere chiamato senza che restituisca null. onActivityCreated è solo un richiamo per quando l'attività è stata completamente creata e il layout del frammento è stato istanziato. – dymmeh

0

se u bisogno di chiamare in getActivity OnCreateView, spostare tutto il codice ur da onCreateView a onActivityCreate e linee lasciato solo

View v = inflater.inflate(R.layout.xxxx, container, false); 
    return v; 

in onCreateView

ma ho una situazione divertente.

in My onActivityCreated

Spinner s1 = (Spinner) getActivity().findViewById(R.id.bitlength); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      getActivity(), R.array.bitlengths, 
      android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    s1.setAdapter(adapter); 

volte l'onActivityCreated solito eseguito (correttamente !?) e quindi il filatore s1 diventata vuota.

Problemi correlati