1

Ich versuche, meine App mit Navigationsschubladenaktivität wiederherzustellen, aber in der alten Version mit einfacher Aktivität habe ich einige Dialogfelder, die Daten vom Benutzer nehmen und innerhalb von Aktivitäten verwalten .Aktivitäts- und Fragmentkommunikation durch eine Methode innerhalb von XML Button

Jetzt habe ich Fragmente und ich bekomme ein Problem, indem ich die Daten vom Benutzer zurückbekomme.

Mein erstes Problem: Die MainActivity enthalten 4 Fragmente, von denen viele Tasten haben, die eine onClick-Methode in der XML verwenden. Mit Aktivität arbeiten alle ohne Problem aber mit Fragmenten Ich kann die Methode der onClick-XML nicht deklarieren!

Das zweite Problem ist, dass die Methode des onClick eine DialogActivity mit startActivityForResult aufruft und Daten mit onActivityResult zurücknimmt. Ich verschiebe die Methode des onClick innerhalb der MainActivity, die das Fragment enthält, aber wenn es den Dialog mit startActivityForResult onActivityResult innerhalb von Fragmenten startet, wird es nicht aufgerufen.

Ich versuche es in der Aktivität zu bewegen und die empfangenen Daten an das Fragment mit Schnittstelle passieren, aber ich bekomme Fehler Drawable style = setButtonColor(color); innerhalb des onActivityResult

Was ist der beste Weg, um dies durchzuführen ist zu funktionieren? Besser, die DialogActivity zu entfernen und DialogFragment zu verwenden, um Daten ohne StartActivityForResult und OnActivityResult zurückzunehmen?

Hier ist der Code, den ich mit den neuen Fragment Grafiken

<Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="@string/new_button" 
     android:id="@+id/m12" 
     android:onClick="addMateria" 
     android:background="@drawable/buttons" 
     android:singleLine="true" 
     android:textSize="12sp" 
     android:layout_column="2" /> 

Das Verfahren der onClick

public void addMateria(View v){ 

     /* Prendo il nome della risorsa cosi nel ricompilare il progetto non perdo * 
     * tutti i riferimenti ai bottoni salvati nel database      */ 

     clickedButtonViewId = getResources().getResourceEntryName(v.getId()); 

     //StartActivityForResult perche mi aspetto la materia inserita dall'altra activity 
     Intent myIntent = new Intent(MainActivity.this, DialogAddMateria.class); 
     startActivityForResult(myIntent, 1); 
     //onStop(); 
    } 

anpassen müssen und wie ich Daten zurück

//Take back data from ActivityAddMateria 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if(requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 

       MySQLiteHelper db = new MySQLiteHelper(getActivity()); 


       Toast.makeText(getContext(), "DENTRO ACTIVITYRESULT", 
         Toast.LENGTH_LONG).show(); 

       //Cambio subito il Button 
       int resId = getResources().getIdentifier(clickedButtonViewId, "id", getActivity().getPackageName()); 
       final Button clickedtextView = (Button) getActivity().findViewById(resId); 

       String result = data.getStringExtra("result"); //Take the materia from Dialog 
       int color = data.getIntExtra("color", 1); //Take the color from Dialog 

       //Controllo se il Button è già presente nel db se presente aggiorno se non presente inserisco 
       boolean modifica = db.Exists(clickedButtonViewId); 

       //Se voglio ripristinare il bottone di default 
       if (color == getResources().getColor(R.color.blue_orario)) { 

        //Ripristino la grafica di Default 
        Drawable style = setButtonColor(color); 
        clickedtextView.setBackground(style); 
        clickedtextView.setText("New"); 

        //Se la materia è nel database la cancello 
        if (modifica) { 

         db.deleteSingleMateria(clickedButtonViewId); 

        } 

       } else { 
        //Quando inserisco un normale bottone colorato 
        if (!modifica) { 

         //Materia da inserire in un nuovo spazio 
         db.addMateriaToDb(new Materia(clickedButtonViewId, result, color)); 

        } else { 

         //Materia già presente nel Button quindi aggiorno la materia 
         db.updateMateria(new Materia(clickedButtonViewId, result, color)); 
         Toast.makeText(getContext(), "Materia modificata!", 
           Toast.LENGTH_LONG).show(); 
        } 

        //Inserisco la materia nel DB dei voti_media 
        db.addMateriaVotiFromOrario(new MaterieVoti(result, 0.0)); 

        clickedtextView.setText(result); 
        //clickedtextView.setBackgroundColor(color); 
        //clickedtextView.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY); 
        Drawable style = setButtonColor(color); 
        clickedtextView.setBackground(style); 
       } 
      } 

      if (resultCode == Activity.RESULT_CANCELED) { 
       //Nessuna materia inserita 
      } 

     } 
    }//onActivityResult 

I bin mit Fragmenten nicht vertraut und ich habe etwas schwer zu tun, was ich brauche, wenn mir jemand sagen kann, wie das geht, oder schlage vor, die Kommunikation zwischen onClick und Methode, Fragment und Methode zu ändern, ich bin da!

Antwort

1

hinzugefügt alle zum MainActivity:

Das Verfahren in der XML des Fragment genannt, dass, wenn Sie die Taste startActivityForResult für Nehmen von Daten aus gedrückt wird.

Danach schreibe ich das onActivityResult innerhalb der MainActivity, dass, wenn Daten zurück nehmen, speichern Sie es in DB und ändern Sie den Stil der Schaltfläche innerhalb des Fragments.

MainAcitivty, dass die Fragmente enthalten

public void addMateria(View v){ 

     /* Prendo il nome della risorsa cosi nel ricompilare il progetto non perdo * 
     * tutti i riferimenti ai bottoni salvati nel database      */ 

     clickedButtonViewId = getResources().getResourceEntryName(v.getId()); 

     //StartActivityForResult perche mi aspetto la materia inserita dall'altra activity 
     Intent myIntent = new Intent(MainActivity.this, DialogAddMateria.class); 
     startActivityForResult(myIntent, 1); 
     //onStop(); 
    } 

    //Take back data from ActivityAddMateria 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if(requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 

       MySQLiteHelper db = new MySQLiteHelper(this); 

       //Cambio subito il Button 
       int resId = getResources().getIdentifier(clickedButtonViewId, "id", getPackageName()); 
       final Button clickedtextView = (Button) findViewById(resId); 

       String result = data.getStringExtra("result"); //Take the materia from Dialog 
       int color = data.getIntExtra("color", 1); //Take the color from Dialog 

       //Controllo se il Button è già presente nel db se presente aggiorno se non presente inserisco 
       boolean modifica = db.Exists(clickedButtonViewId); 

       //Se voglio ripristinare il bottone di default 
       if (color == getResources().getColor(R.color.blue_orario)) { 

        //Ripristino la grafica di Default 
        Drawable style = setButtonColor(color); 
        clickedtextView.setBackground(style); 
        clickedtextView.setText("..."); 

        //Se la materia è nel database la cancello 
        if (modifica) { 

         db.deleteSingleMateria(clickedButtonViewId); 

        } 

       } else { 
        //Quando inserisco un normale bottone colorato 
        if (!modifica) { 

         //Materia da inserire in un nuovo spazio 
         db.addMateriaToDb(new Materia(clickedButtonViewId, result, color)); 

        } else { 

         //Materia già presente nel Button quindi aggiorno la materia 
         db.updateMateria(new Materia(clickedButtonViewId, result, color)); 
         Toast.makeText(MainActivity.this, "Materia modificata!", 
           Toast.LENGTH_LONG).show(); 
        } 

        //Inserisco la materia nel DB dei voti_media 
        db.addMateriaVotiFromOrario(new MaterieVoti(result, 0.0)); 

        clickedtextView.setText(result); 
        //clickedtextView.setBackgroundColor(color); 
        //clickedtextView.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY); 
        Drawable style = setButtonColor(color); 
        clickedtextView.setBackground(style); 
       } 
      } 

      if (resultCode == Activity.RESULT_CANCELED) { 
       //Nessuna materia inserita 
      } 

     } 
    }//onActivityResult 

Das Fragment einfache Prüfung, ob die Daten in der DB ist und aktualisieren Sie die Ansicht

List<Materia> materia; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.orario_view, container, false); 

     MySQLiteHelper db = new MySQLiteHelper(getActivity()); 

     //Get all materie inside database 
     materia = db.getAllMaterie(); 
     //change all TextView inputed from user 
     if(materia.isEmpty()){ 
      //do nothing 
     }else { 
      for (Materia mat : materia) { 
       //Change all the Button with values stored inside the database 
       int resId = getResources().getIdentifier(mat.getID(), "id", getActivity().getPackageName()); 
       Button changedButton = (Button) view.findViewById(resId); 
       changedButton.setText(mat.getMateria()); 
       changedButton.setTypeface(null, Typeface.BOLD); 

       Drawable style = setButtonColor(mat.getColor()); 
       changedButton.setBackground(style); 
      } 
     } 

     return view; 
    } 
1

Diese Frage oft gefragt wird, Kommunikation zwischen Aktivität und Fragmente kann in vielerlei Hinsicht wie Gabe von Daten in Bündeln, Grimassen Singleton-Muster als auch pro here und mit EventBus erläuterte durchgeführt werden, siehe this Antwort, ich jeden Aspekt erklärt habe, wie Sie können es tun, und wenn Sie mehr Verständnis wollen, dann kommentieren Sie es.

Offizielle Dokumente sind here

+0

Ja, aber das Problem mit dem Verfahren? In Post erkläre ich meine Situation nicht nur Daten zwischen Aktivität und Fragment übergeben: D. Das Hauptproblem ist, dass ich die Methode innerhalb Fragment (addMateria()) nicht deklarieren kann und wenn ich es innerhalb MainActivity deklariere das OnActivityResult Inside-Fragment keine Daten von der aufgerufenen DialogActivity zurück – Dario

+0

Innerhalb Ihrer Fragmente können Sie Aktivitätskontext abrufen Alles, was Sie tun müssen, ist onActivityResult() in Ihrem Fragment aufrufen, und Sie müssen es auch in Ihre Aktivität implementieren und verweisen Sie es in Fragment durch den Aufruf von super.onActivityResult() und Sie können dieses Problem lösen – TapanHP

+0

i Gelöst mit dieser Lösung. ..all in MainActivity deklariert ... die Methode addMateria() ... also das startActivityForResult und das onActivityResult auch ... und immer noch funktioniert ... ist es richtig wie ich es mache? Oder es funktioniert, aber es ist illegal: D – Dario

Verwandte Themen