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ückschickenDas 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?
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
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
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