2012-07-31 6 views
17

ich eine Aktivität haben, die funktioniert ein Fragment TransaktionAndroid: Fragment kann nicht Aktivität erhalten

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

, die gut funktioniert. Jetzt weiß ich innerhalb meiner Aktivität eine dynamische Zeichenfolge, die ich in dem Layout ersetzen muss, das ich in newFragment habe. Ich dachte, dass ich nach transaction.commit() aufrufen können nur so etwas wie

newFragment.setMyString("my dynamic value"); 

Und in der newFragment.java I

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

Der Punkt ist, dass getActivity() gibt den Wert null. Wie kann ich den Kontext erhalten, den ich brauche, um meine Layout-Elemente zu finden?

Edit:

Ich versuche, die Strecke mit einem Bündel zu folgen, wie dies der sauberste Weg zu sein scheint. So habe ich meinen Code geändert:

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

Mein Fragment onCreateView wie folgt aussieht:

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

Es scheint, dass savedInstranceState leer. Wo soll ich mein Bündel finden?

Edit2:

die getArguments verpasst() in der Antwort. arbeitet jetzt.

Antwort

17

Ihre Fragment hat nicht auf die noch Activity angebracht, was auch bedeutet, dass Ihr Layout hasn noch nicht aufgeblasen (siehe Fragment lifecycle). Die beste Lösung wäre hier, Ihren String Wert als ein Argument zu der Fragment über die Fragment.setArguments(Bundle) Methode hinzuzufügen. Dies kann im empfangenden über die Fragment.getArguments() Methode abgerufen werden.

+1

Mein Layout ist aufgebläht onViewCreated heißt. Ich kann mein Layout sehen. – AndyAndroid

2

Also ich auch die gleichen Fragment Transaktionsmanager verwenden und das einzig Problem, das ich mit Ihrem Code sehen kann, ist, dass Sie den Textview-tv in Ihrer onCreateView Methode Ihrer newFragment Klasse definieren und es dann als wie folgt instanziiert:

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

ich weiß, es does'nt wirklich viel Sinn, aber das ist, wie ich meinen Code leite und es funktioniert gut :)

+0

Entschuldigung wusste nicht, dass es so wichtig war :) änderte es ... hoffentlich sieht jetzt besser aus – Android2390

+3

Natürlich ist das Einrücken Ihres Codes auf StackOverflow wichtig ... Leute werden nicht denken, dass Sie eine sehr glaubwürdige Quelle sind Code ist offensichtlich nicht lesbar. Ich habe gerade deine Antwort bearbeitet und den Downvote entfernt. –

20

Stellen Sie sicher, dass Sie getActivity() in oder nach onAttach() anrufen, wie zuvor, dann wird null zurückgegeben.

+0

Entschuldigung, ich verstehe nicht, wo ich getActivity() aufrufen und an meine setMyString() - Funktion übergeben soll. Und wenn ich es tue, wo Sie vorschlagen, dass Sie noch schreiben, kann es oder möglicherweise nicht Null zurückgeben. Wie soll ich das verstehen? – AndyAndroid

+6

Das 'Fragment' wird an eine 'null'-Aktivität angehängt bis' onActivityCreated' ... das heißt, wenn Sie 'getActivity()' in 'onCreate' oder' onCreateView' aufrufen, wird 'null' zurückgegeben, da' Aktivität' wurde noch nicht erstellt. Stellen Sie also sicher, dass Sie alle Aufrufe von 'getActivity()' * in oder nach * 'onActivityCreated' haben. –

+4

Das ist falsch. Sobald onAttach aufgerufen wird, kann getActivity() aufgerufen werden, ohne dass es null zurückgibt. onActivityCreated ist nur ein Rückruf, wenn die Aktivität vollständig erstellt wurde und das Layout des Fragments instanziiert wurde. – dymmeh

0

wenn u brauchen getActivity in OnCreateView zu nennen, die alle von onCreateView zu onActivityCreate ur-Code bewegen und nur links Linien

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

in onCreateView

aber ich habe eine lustige Situation.

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

Irgendwann die onActivityCreated gewohnt laufen (richtig !?) und damit die Spinner leer s1 werden.