webentwicklung-frage-antwort-db.com.de

Android: Wie aktualisiere ich mein TextView in einem Fragment?

Ich versuche, Fragmente zu verwenden, um meine erste richtige Android-App zu erstellen. Ich habe eine Haupt-XML. Das obere Fragment besteht aus zwei vertikalen Fragmenten, die oberen Fragmente bestehen aus nur zwei TextViews. Der erste enthält statischen Text und der zweite enthält einen Wert, den ich schließlich dynamisch von SQL bekomme.

Wenn ich dies meine MainActivity.Java stelle, wird der Wert der TextView in meinem ersten Fragment glücklich aktualisiert:

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 habe zwei Fragment-XMLs und ein Java, die beide unterstützen. Daher möchte ich die Einstellung dieses Felds in Java einfügen, das das Fragment unterstützt, und nicht das Java, das für MainActivity verwendet wird.

Wenn ich es in das Fragment stecke, sieht es so 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");
}

Wenn ich das tue, bekomme ich einen Fehler in der TextView-Zeile:

"Die Methode findViewById (int) ist für den Typ FragmentMainTop nicht definiert."

Warum kennt es diese Methode nicht? Ich habe ctl/shift/o, also weiß ich, dass ich alle richtigen Importe habe. Ich möchte nicht, dass ich meinen gesamten Code in die MainActivity packe um den gesamten Code zu wiederholen.

14
RobT

Sie müssen das aufgeblähte Fragmentlayout einer Variablen zuweisen, damit Sie auf die findViewById()-Methode zugreifen können. Dann geben Sie es zurück, sobald Sie Ihre Widgets aktualisiert haben. 

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

Wenn Sie findViewById() in einer Activity aufrufen, rufen Sie normalerweise Activity.findViewById() auf. Wenn Sie denselben Aufruf innerhalb Ihrer Fragment-Klasse versuchen, schlägt dies fehl, da es keine solche Fragment.findViewById()-Methode gibt. Sie müssen also View.findViewById() mit Ihrer überhöhten Ansicht verwenden, um Referenzen zu Ihren Widgets zu erhalten.

46
Tyler MacDonell

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

Also versuchen Sie die Reihenfolge zu ändern! :)

2
Husky

Ich verwende diesen Code aus meiner Aktivität, um eine in xml-Tag hinzugefügte Textansicht zu aktualisieren. Die Textansicht sind Objekte auf Klassenebene. Hier ist 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" />

Hier ist der Fragmentcode, der nur die Klassenebenenvariable 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 die Aktivität von wo ich mein Fragment aktualisiere:

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.

0