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
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.
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();
À 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);
}
}
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);
}
}
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;