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
@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.
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();
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);
}
}
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:
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);
}
@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;
verwenden Sie diese Codezeile, um Unterstützung für Textfelder zu erhalten
private FragmentManager supportFragmentManager;