Probleme mit Debugger / Logging ..

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit Debugger / Logging ..

    Hallo zusammen,

    ich bin gerade dabei an meiner ersten Android-App zu basteln und habe schon mehrere Schwierigkeiten.

    ich rufe eine Activity auf, die als Pop-Up dienen soll:

    Quellcode

    1. Intent intent = new Intent(this, PopUp.class);
    2. startActivityForResult(intent, ACTIVITY_POPUP);



    In meiner aufrufenden Activity will ich dann auch meine Results entgegen nehmen:

    Quellcode

    1. public void onActivityResult(int requestCode, int resultCode, Intent data)
    2. {
    3. if (requestCode == ACTIVITY_POPUP)
    4. {
    5. if (resultCode == RESULT_OK)
    6. {
    7. String date = data.getStringExtra("Date");
    8. String weight = data.getStringExtra("Weight");
    9. String comment = data.getStringExtra("Comment");
    10. }
    11. }
    12. }
    Alles anzeigen

    In meiner PopUp-Activity soll es möglich sein Eingaben zu machen, diese sollen nach Drücken des Speicher-Buttons an die aufrufende Form zurückgeschickt werden:


    Quellcode

    1. Log.d("savePopUp", "!?!?!?!");
    2. EditText editDate = findViewById(R.id.editDate);
    3. String s = editDate.getText().toString();
    4. Log.d("1221", s);
    5. Intent returnValues = new Intent();
    6. Log.d("333",editDate.getText().toString());
    7. returnValues.putExtra("Date", editDate.getText().toString());
    8. setResult(RESULT_OK, returnValues);
    9. finish();
    Alles anzeigen

    Leider funktioniert das ganze nicht. Er protokolliert mir auch nur diese Zeile raus:
    Log.d("savePopUp", "!?!?!?!");Die anderen Log-Einträge macht er erst gar nicht. Problematisch ist auch, dass er beim Debuggen überhaupt nicht in meiner Save-Function stoppt? In der OnCreate-Methode der PopUp-Activity stoppt er allerdings schon - also kein generelles Problem.In der onActivityResult() stoppt er auch nicht wenn ich einen Breakpoint mache.Was mache ich falsch?Viele Grüße.
  • Hallo,

    das Debuggen geht immer noch nicht, aber das Loggen funktioniert. Ich habe das Projekt mit dem "Bottom Navigation Activity" Template erstellt. Das beinhaltet auch 3 Fragmente mit jeweils einem ViewModel.

    Eventuell habe ich das auch ganz falsch implementiert. Die Funktion mit dem Aufruf des PopUps ist in meiner MainActivity. Der tatsächliche Button, der die Funktion aufruft, befindet sich aber auf einem Fragment.
    Sollte die Funktion dann direkt in das ViewModel und nicht in die MainActivity? Und das OnActivityResult dann auch im gleichen ViewModel ausprogrammieren?

    Wie sind hier die Best Practices? Eventuell muss ich mich auch erst einmal einlesen, wofür Fragments / ViewModels eigentlich da sind.
  • Hallo also erstmals solltest du in deiner Result Methode auch die Superkasse aufrufen.

    Quellcode

    1. public void onActivityResult(int requestCode, int resultCode, Intent data) {
    2. super.onActivityResult(requestCode, resultCode, data);
    3. if (requestCode == 1234) {
    4. if (resultCode == RESULT_OK) {
    5. ....



    Fx999 schrieb:

    Leider funktioniert das ganze nicht. Er protokolliert mir auch nur diese Zeile raus:
    Log.d("savePopUp", "!?!?!?!");Die anderen Log-Einträge macht er erst gar nicht.

    Wenn du das alles in der onCreate der Popup Kasse machst ist die schon beendet bevor du eine Eingabe machen kannst.
    Auf jeden fall brauchst du einen Listner der wartet.
    Entweder du erstellst einen Button und wertest dort die Eingabe aus und machst dein Result. Oder du setzt auf den EditText einen textwatcher mit Listner.


    Fx999 schrieb:

    Die Funktion mit dem Aufruf des PopUps ist in meiner MainActivity. Der tatsächliche Button, der die Funktion aufruft, befindet sich aber auf einem Fragment.


    Finde ich falsch. Dort wo der Button ist solltest du auch dein Popup aufrufen. Und dort wo der Aufruf ist kommt auch das Result an.

    Denke daran im Fragment brauchst den Kontext der Activity zb. bei findViewByIdoder auch beim Intent.

    Quellcode

    1. Intent intent = new Intent(getActivity(), PopUp.class);
    Ein Feedback auf Tipps ist auch schön. :P
  • Hallo! Vielen Dank für die Antwort. Ich habe schon eine gesonderte Methode der PopUp-Klasse, die das macht. Es wird nicht in der onCreate ausgeführt.
    Ich habe es grad komischerweise ein einziges Mal geschafft auch im OnActivityResult() der MainActivity anzukommen, das ist passiert als meine PopUp-Activity mal gehängt ist und ich mehrmals auf den "Save" Button drücken konnte. Also scheint hier irgendwas mit den Events im Argen zu liegen.

    Ich wollte eigentlich schon die Klasse NotificationsViewModel (das Fragment) für diese Save-Funktion nutzen, aber hier kann ich im "onClick"-Event die Funktion dann gar nicht finden, obwohl sie als public deklariert ist.


    Edit: ich habe jetzt auch den Aufruf super.onActivityResult(requestCode, resultCode, data); hinzugefügt und nun geht sowohl das Debuggen und er kommt auch immer in die Funktion rein.

    Als nächstes möchte ich Daten, die ich zurückbekommen habe, in einer Liste anzeigen und schlussendlich auch abspeichern. Was würdest du hier empfehlen? Speichern im Dateisystem oder in einer SQLite-Datenbank?

    Viele Grüße.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Fx999 () aus folgendem Grund: Geht jetzt

  • Fx999 schrieb:

    Ich wollte eigentlich schon die Klasse NotificationsViewModel (das Fragment) für diese Save-Funktion nutzen, aber hier kann ich im "onClick"-Event die Funktion dann gar nicht finden, obwohl sie als public deklariert ist.
    In der Model Klasse gibt es kein onClick das ist nur eine Daten Klasse zum Austauschmit der Activity.
    Events haben da nichts zu suchen.


    Fx999 schrieb:

    Also scheint hier irgendwas mit den Events im Argen zu liegen.


    Wo ist den dein Button?

    Ich denke im Layout des Fragments. Also mache auch dort deinen Listner für den Button.

    Wie ich sagte Context der Activty benutzen.

    Denn das Event kommt in der Activty an und wenn du es in den Fragment bearbeitest brauchst du den Context.

    Auch ist es so dort wo du den intent startest sollte die Result Methode sein.

    Quellcode

    1. public class NotificationsFragment extends Fragment {
    2. private NotificationsViewModel notificationsViewModel;
    3. Button bt_Popup;
    4. public View onCreateView(@NonNull LayoutInflater inflater,
    5. ViewGroup container, Bundle savedInstanceState) {
    6. notificationsViewModel =
    7. ViewModelProviders.of(this).get(NotificationsViewModel.class);
    8. View root = inflater.inflate(R.layout.fragment_notifications, container, false);
    9. final TextView textView = root.findViewById(R.id.text_notifications);
    10. notificationsViewModel.getText().observe(this, new Observer<String>() {
    11. @Override
    12. public void onChanged(@Nullable String s) {
    13. textView.setText(s);
    14. }
    15. });
    16. bt_Popup= root.findViewById(R.id.button);
    17. bt_Popup.setOnClickListener(new View.OnClickListener() {
    18. @Override
    19. public void onClick(View v) {
    20. Intent intent = new Intent(getActivity(), PopUp.class);
    21. startActivityForResult(intent, 1234);
    22. }
    23. });
    24. return root;
    25. }
    26. public void onActivityResult(int requestCode, int resultCode, Intent data) {
    27. super.onActivityResult(requestCode, resultCode, data);
    28. if (requestCode == 1234) {
    29. if (resultCode == Activity.RESULT_OK) {
    30. String date = data.getStringExtra("Date");
    31. String weight = data.getStringExtra("Weight");
    32. String comment = data.getStringExtra("Comment");
    33. notificationsViewModel.setDaten(date);
    34. }
    35. }
    36. }
    37. }
    Alles anzeigen


    Quellcode

    1. public class NotificationsViewModel extends ViewModel {
    2. private MutableLiveData<String> mText;
    3. String date;
    4. public NotificationsViewModel() {
    5. mText = new MutableLiveData<>();
    6. mText.setValue("This is notifications fragment");
    7. }
    8. public LiveData<String> getText() {
    9. return mText;
    10. }
    11. public void setDaten(String date) {
    12. this.date = date;
    13. }
    14. public String getDaten(){
    15. return date;
    16. }
    17. }
    Alles anzeigen

    in einen anderen Fragment oder in der activty kannst du nun auf das Model zugreifen.

    ViewModelProviders.of(this).get(NotificationsViewModel.class);

    Quellcode

    1. public class DashboardFragment extends Fragment {
    2. private DashboardViewModel dashboardViewModel;
    3. private NotificationsViewModel notificationsViewModel;
    4. public View onCreateView(@NonNull LayoutInflater inflater,
    5. ViewGroup container, Bundle savedInstanceState) {
    6. dashboardViewModel =
    7. ViewModelProviders.of(this).get(DashboardViewModel.class);
    8. notificationsViewModel = ViewModelProviders.of(requireActivity()).get(NotificationsViewModel.class);
    9. View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
    10. final TextView textView = root.findViewById(R.id.text_dashboard);
    11. dashboardViewModel.getText().observe(this, new Observer<String>() {
    12. @Override
    13. public void onChanged(@Nullable String s) {
    14. textView.setText(s);
    15. }
    16. });
    17. TextView tx = root.findViewById(R.id.textView);
    18. tx.setText(notificationsViewModel.getDaten());
    19. return root;
    20. }
    21. }
    Alles anzeigen
    Ein Feedback auf Tipps ist auch schön. :P