Comment changer le texte de TextView de fragment de l'activité

Je ne trouve pas comment changer textview de fragment d'un Activity. J'ai 4 fichiers :

MainActivity.java
activity_main.xml
FragmentClass.java
frag_class.xml

Frag_class.xml a textView, je veux changer le texte de MainActivity.Java. FragmentClass étend Fragment, ce fragment est affiché dans MainActivity FragmentClass a:

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

Et dans MainActivity j'ai essayé ceci:

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

Mais malheureusement ce code me donne NullPointerException à fc.changeText("some text"); J'ai également essayé de changer le texte directement de MainActivity avec:

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

Qui Échouer.

[MODIFIER] Le code complet est ici

27
demandé sur m-ric 2013-04-30 12:08:02

5 réponses

@ Lalit la réponse est correcte mais je vois que vous n'avez pas besoin de créer une fonction comme fragment_obj.updateTextView();. J'ai défini toute ma vue comme des objets de niveau de classe et j'ai pu mettre à jour directement textview.

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

Remarque: Si vous devez effectuer plus d'une action, avoir une fonction est la solution.

5
répondu Illegal Argument 2015-03-13 06:00:03

Vous pouvez trouver l'exemple de Fragment, en utilisant,

Pour la bibliothèque de support,

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

Else

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

Ensuite, créez une méthode dans le Fragment qui met à jour votre TextView et appelez cette méthode en utilisant fragment_obj comme,

fragment_obj.updateTextView();

11
répondu Lalit Poptani 2013-04-30 08:13:07

À Partir de activity à Fragment par 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);  
    }
}
9
répondu Daryn 2013-04-30 09:35:53

Je l'ai accompli autrement. J'ai mon application qui fonctionne comme ceci:

Après avoir tiré mon application, J'ai MainActivity avec HomeFragment créé. Dans HomeFragment j'ai Button et TextView pour la connexion / affichage de L'état de BluetoothConnection.

Dans HomeFragment, J'ai implémenté un gestionnaire pour recevoir des informations de BluetoothService. Après avoir reçu le message, je voulais mettre à jour TextView et le texte du bouton. J'ai créé une interface publique dans HomeFragment avec une méthode qui obtient une chaîne arguments pour TextView et Button. Dans onAttach (activité a), j'ai créé l'objet mCallback pour parler à activity.

L'étape suivante consiste à implémenter cette Interface dans MainActivity. De cette activité, je mets à jour TextView et Button. Tout ressemble à ceci:

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

MainActivity.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
répondu Pan Wrona 2014-08-28 08:04:21
public class Dcrypt extends Fragment {

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

Utilisez cette ligne de code pour obtenir le support du champ de texte

private FragmentManager supportFragmentManager;
0
répondu Amank 2017-07-11 08:52:39