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