2013-03-10 14 views
14

Ich versuche, Fragmente zu verwenden, um meine erste richtige Android App zu bauen. Ich habe eine Haupt-XML. Das obere Fragment besteht aus zwei vertikalen Fragmenten und besteht aus nur zwei TextViews. Der erste enthält statischen Text und der zweite enthält einen Wert, den ich später dynamisch aus SQL erhalten werde.Android: Wie aktualisiere ich meine TextView in einem Fragment

Wenn ich diese meine MainActivity.java ist es dann glücklich, den Wert des Textview-Updates in meinem ersten Fragment:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    // Set the Text to try this out 
    TextView t = (TextView)findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 
} 

ich zwei Fragment XMLs und ein Java-Unterstützung haben jeweils so will ich setzen die Einstellung dieses Feldes in Java, das das Fragment unterstützt, und nicht das Java, das für die MainActivity vorgesehen ist.

Wenn ich es in das Fragment gesetzt sieht es wie folgt aus: -

public class FragmentMainTop extends Fragment { 
@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState){ 
    // -- inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragmentmt, container,false); 

    // Set the Text to try this out 
    TextView t = (TextView)findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 
} 

Aber wenn ich dies tun bekomme ich einen Fehler auf der Textview-Zeile:

„Die Methode findViewById (int) ist undefiniert für den Typ FragmentMainTop "

Also warum kennt es diese Methode nicht? Ich habe ctl/shift/o, also weiß ich, dass ich die richtigen Importe habe. Ich möchte nicht meinen gesamten Code in MainActivity stecken, denn wenn ich das Fragment dann in einer anderen Aktivität verwenden will, muss ich den ganzen Code wiederholen.

Antwort

45

Sie müssen das überhöhte Fragmentlayout einer Variablen zuweisen, damit Sie auf die findViewById()-Methode zugreifen können. Dann geben Sie es zurück, sobald Sie mit der Aktualisierung Ihrer Widgets fertig sind.

@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState){ 
    // -- inflate the layout for this fragment 
    View myInflatedView = inflater.inflate(R.layout.fragmentmt, container,false); 

    // Set the Text to try this out 
    TextView t = (TextView) myInflatedView.findViewById(R.id.viewItem); 
    t.setText("Text to Display"); 

    return myInflatedView; 
} 

Normalerweise, wenn Sie findViewById() innerhalb eines Activity nennen, sind den Aufruf Sie Activity.findViewById(). Der gleiche Anruf innerhalb Ihrer Fragment Klasse wird fehlschlagen, weil es keine solche Fragment.findViewById() Methode gibt. Daher müssen Sie View.findViewById() mit Ihrer aufgeblähten Ansicht verwenden, um Verweise auf Ihre Widgets zu erhalten.

+0

Die Referenzen werden erfolgreich zurückgegeben, auch wenn ich ViewByID für die von fragment.getActivity() zurückgegebene Aktivität finde. Das dynamische Aktualisieren der Ansichten funktioniert jedoch immer noch nicht –

2

Ich bin kein Experte, aber ich würde etwas und die nächsten Zeilen nach dieser Aussage innerhalb einer Methode, dass return-Anweisung sagen gibt nicht erreichbar sind: O

So versuchen die Reihenfolge zu ändern! :)

0

Ich verwende diesen Code aus meiner Aktivität, um eine Textansicht im xml-Tag zu aktualisieren. Die Textansicht sind Objekte auf Klassenebene. Heres ein Code:

<fragment 
    android:id="@+id/fragmentRegister" 
    android:name="com.proshore.loveis.RegisterFragment" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/view1" /> 

Heres der Fragmentcode, der gerade die Klassenstufenvariable zeigt.

public class RegisterFragment extends Fragment implements OnClickListener { 

TextView textViewDOB, textViewLanguage; 

public RegisterFragment() { 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
//eluded methods here 
} 
} 

Nun ist die Aktivität von wo ich mein Fragment aktualisieren:

public class RegisterActivity extends FragmentActivity { 
Button buttonEnter; 
RegisterFragment fragmentRegister; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 
    buttonEnter = (Button) findViewById(R.id.buttonEnter); 
    fragmentRegister = (RegisterFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.fragmentRegister); 
} 

@Override 
protected void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    buttonEnter.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Log.d("dontknowitwillowrk", fragmentRegister.textViewLanguage 
        .getText().toString()); 
      fragmentRegister.textViewLanguage.setText("hello mister how do you do"); 


     } 
    }); 
} 
} 

Hinweis: nicht sicher, ob dies ein guter Weg ist.

Verwandte Themen