2016-09-16 2 views
0

Ich habe 80 verschiedene Buttons mit verschiedenen IDs, also setze ich android:"onClick" = addMateria; aber das Problem ist, dass ich Fragment verwenden und er kann die Methode addMateria innerhalb Fragment nicht sehen.onActivityResult nehmen keine Daten zurück in Fragment

Also habe ich die Methode innerhalb der Activity, die die Fragment enthalten. Diese Methode ruft startActvityForResult auf und das Fragment übernimmt die Daten zurück.

Das Problem ist, dass das Fragment nicht nichts zurücknehmen. Ich lese einige Post, die vorschlagen, super.onActivityResult oder einfach Anruf StartActivityForResult zu verwenden, aber nichts zu ändern!

Das Verfahren in der Aktivität, die alle Fragmente

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

Diese verwalten die onActivityResult innerhalb des Fragment

//Take back data from ActivityAddMateria 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 

       MySQLiteHelper db = new MySQLiteHelper(getActivity()); 

       //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 

Warum die Methode nicht anfangen, und ich kann innen nicht empfangenen Daten speichern Datenbank?

Was ich habe: Ein Fragment, das seine Ansicht ist mit 80 Schaltflächen mit einer Methode onClick, die eine Aktivität für das Ergebnis zu starten. Diese Methode eine dialogActivity starten, die Daten von Benutzer nehmen und

mit onActivityResult zum Fragment zurückschicken

Das Problem: Die Methode addMateria mit onClick innerhalb xml nannte es unmöglich ist, es innerhalb Fragment direkt zu erklären, und wenn ich erklären es innerhalb der Aktivität, die Fragment enthalten Das onActivityResult nimmt die Daten von Dialog nicht zurück, daher denke ich, dass die Verbindung zwischen startActivityForResult (innerhalb von Activity) und onAcitivtyResult (in Fragment) verloren geht, wenn die Methode von Activity aus startet.

Der einzige/beste Weg, es ist mit Interface?

Antwort

0

Wenn Sie Daten zwischen einem Fragment und einer Aktivität übergeben möchten und umgekehrt, empfehle ich die Verwendung von Schnittstellen.

Schnittstellen zu verwenden, würde ich den Code ändern, wie so:

zuerst die Schnittstelle definieren.

public interface FragmentCommunication { 
    void onAddMateriaClicked(/* Add item(s) you wish to be passed here*/); 
} 

Dann sagte Implement Schnittstelle in Ihrem Fragment, den Code zu ersetzen Sie in der onActivityResult Methode in unserem überschriebenen onAddMateriaClicked Methode hatte:

public class MyFragment extends Fragment implements FragmentCommunication { 
    //... 
    @Override 
    public void onAddMateriaClicked() { 
     if(requestCode == 1) { 
      if (resultCode == Activity.RESULT_OK) { 

       MySQLiteHelper db = new MySQLiteHelper(getActivity()); 

       //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 
      } 
     } 
    } 
} 

Jetzt ändern wir unsere Tätigkeit die onAddMateriaClicked Methode aufrufen, wenn die Taste geklickt wurde:

public class MyActivity extends Activity { 

    private FragmentCommunication communication; 
    private MyFragment fragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     fragment = new MyFragment(); 
     communication = fragment; 
    } 

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


     communication.onAddMateriaClicked(); 
     //onStop(); 
    } 
} 

Jetzt onAddMateriaClicked wird innerhalb des Fragments genannt werden w Wenn Sie Ihren Knopf drücken.

Stellen Sie sicher, dass Sie alle Daten, die Sie als Parameter an den onAddMateriaClicked Artikel übergeben möchten, hinzufügen.

+0

Hallo Weava, danke für deinen Vorschlag. Ich werde Ihre Methode versuchen, aber trotzdem kann ich die Methode addMateria in Fragment ohne Schnittstelle nicht setzen? Oder ist es der einzige Weg? – Dario

+0

Die onClick-Funktion muss einer Ansicht innerhalb derselben Aktivität oder desselben Fragments zugewiesen werden, wie sie deklariert ist. Wenn sich Ihre Schaltfläche in der Aktivität befindet, müssen Sie über eine Methode verfügen, um diese Daten an das angehängte Fragment zu senden. Es gibt andere Wege, aber ich finde dies am saubersten. – Weava

+0

Ja, die Funktion onClick befindet sich in der Ansicht des Fragments, das nicht in der Aktivität enthalten ist. Die Ansicht mit allen Buttons mit onClick-Methode wird von Fragment verwaltet, dass in ihm die onclick-Methode eine Dialog_Activity aufruft, die einige Daten zurückgibt .... aber trotzdem kann ich die Methode nicht in Fragment_class deklarieren. – Dario

Verwandte Themen