it-swarm.com.de

So ändern Sie den Text des Fragments textView von der Aktivität

Ich kann nicht finden, wie textview eines Fragments von einer Activity geändert wird. Ich habe 4 Dateien:

MainActivity.Java
activity_main.xml
FragmentClass.Java
frag_class.xml

frag_class.xml hat textView, ich möchte den Text von MainActivity.Java ..__ ändern. FragmentClass erweitert Fragment, dieses Fragment wird in MainActivity .__ angezeigt. FragmentClass hat:

public void changeText(String text){
 TextView t = (TextView) this.getView().findViewById(R.id.tView);
 t.setText(text);
}

und in MainActivity habe ich folgendes versucht:

FragmentClass fc = new FragmentClass();
fc.changeText("some text");

Aber leider gibt mir dieser Code NullPointerException bei fc.changeText("some text"); Ich habe auch versucht, den Text direkt aus MainActivity zu ändern:

 TextView t = (TextView) this.getView().findViewById(R.id.tView);
 t.setText(text);

was fehlgeschlagen ist.

[EDIT] Der vollständige Code ist hier

28
Cԃաԃ

@Lalit Antwort ist korrekt, aber ich sehe, dass Sie keine Funktion wie fragment_obj.updateTextView (); erstellen müssen. Ich habe alle meine Ansichten als Klassenebenenobjekte festgelegt und konnte die Textansicht direkt aktualisieren.

fragmentRegister.textViewLanguage.setText("hello mister how do you do");

Hinweis: Wenn Sie mehr als eine Aktion ausführen müssen, müssen Sie eine Funktion ausführen.

5

Sie können die Instanz von Fragment finden, indem Sie

Für Support-Bibliothek,

YourFragment fragment_obj = (YourFragment)getSupportFragmentManager().
                                              findFragmentById(R.id.fragment_id);

else

YourFragment fragment_obj = (YourFragment)getFragmentManager().
                                             findFragmentById(R.id.fragment_id); 

Erstellen Sie dann im Fragment eine Methode, die Ihr TextView aktualisiert, und rufen Sie diese Methode mit fragment_obj wie folgt auf:

fragment_obj.updateTextView();

11
Lalit Poptani

Von activity zu Fragment durch Fragment Transaction:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); 
    }
    public static void changeFragmentTextView(String s) {
        Fragment frag = getFragmentManager().findFragmentById(R.id.yourFragment);
        ((TextView) frag.getView().findViewById(R.id.textView)).setText(s);  
    }
}
10
Daryn

Ich habe es anders gemacht. Meine App funktioniert so:

Nach dem Auslösen meiner App habe ich MainActivity mit HomeFragment erstellt. In HomeFragment habe ich Button und TextView zum Verbinden/Anzeigen des BluetoothConnection-Status. 

In HomeFragment habe ich Handler implementiert, um Informationen vom BluetoothService zu erhalten. Nach Erhalt der Nachricht wollte ich TextView und Button-Text aktualisieren. Ich habe eine öffentliche Schnittstelle in HomeFragment mit einer Methode erstellt, die String-Argumente für TextView und Button erhält. In onAttach (Aktivität a) habe ich ein mCallback-Objekt erstellt, um mit Aktivitäten zu sprechen.

Der nächste Schritt ist die Implementierung dieser Schnittstelle in MainActivity. Von dieser Aktivität aus aktualisiere ich TextView und Button. Alles sieht so aus:

HomeFragment.Java

public interface ViewInterface{
    public void onViewUpdate(String buttonTxt, String txtTxt);
}

@Override
public void onAttach(Activity a){
    super.onAttach(a);
    try{
        mCallback = (ViewInterface)a;
    }catch (ClassCastException e){
        e.printStackTrace();
    }
}

private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {

                case MESSAGE_STATE_CHANGE:

                    if(true) Log.i(CLASS_TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
                    switch (msg.arg1) {
                        case BluetoothConnectionService.STATE_CONNECTED:

                            threadTextString = "Connected to: " + connectedDeviceName;
                            threadBtnString = "Disconnect";
                            mCallback.onViewUpdate(threadBtnString, threadTextString);
                            break;
                        case BluetoothConnectionService.STATE_CONNECTING:
                           threadTextString = "Connecting...";
                            mCallback.onViewUpdate(threadBtnString, threadTextString);
                            break;
                         case BluetoothConnectionService.STATE_NONE:

                            threadBtnString = "Connect";
                            threadTextString = "You're not connectedd";
                            mCallback.onViewUpdate(threadBtnString, threadTextString);
                            break;
}

private void updateBtn(Button btn, String data){
    btn.setText(data);
    Log.d(CLASS_TAG + "/" + "updateBtn", "Data: " + data);
}

private void updateTxt(TextView txt, String data){
    txt.setText(data);
    Log.d(CLASS_TAG + "/" + "updateTxt", "Data: " + data);

}

public void update(String buttonTxt, String txtTxt){
    this.updateTxt(connectTxt, txtTxt);
    this.updateBtn(connectButton, buttonTxt);
}

Hauptaktivität.Java

@Override
public void onViewUpdate(String buttonTxt, String txtTxt) {
    HomeFragment homeFragment = (HomeFragment)getSupportFragmentManager().findFragmentById(R.id.frame_container);
    if(homeFragment != null){
    homeFragment.update(buttonTxt, txtTxt);
    }
}
1
Pan Wrona
public class Dcrypt extends Fragment {

Button butD;
ImageButton Dcopy;
EditText getPass;
TextView txtShow;

verwenden Sie diese Codezeile, um Unterstützung für Textfelder zu erhalten

private FragmentManager supportFragmentManager;
0
Amank