onActivityResult не возвращает данные обратно во фрагмент
У меня 80 разных Buttons
с разными идентификаторами, поэтому я установил android:"onClick" = addMateria;
но проблема в том, что я использую Fragment, и он не может видеть метод addMateria внутри Fragment
,
Так что я положил метод внутри Activity
которые содержат Fragment
, Этот метод вызывает startActvityForResult, а фрагмент возвращает данные.
Проблема в том, что Фрагмент ничего не забирает обратно. Я прочитал некоторые посты, которые предлагают использовать super.onActivityResult
или простой звонок StartActivityForResult
но ничего не изменится!
Метод внутри Activity, который управляет всеми Фрагментами
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();
}
Это onActivityResult внутри фрагмента
//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
Почему метод не запускается и я не могу сохранить полученные данные в базе данных?
Что у меня есть: фрагмент, который он просматривает, состоит из 80 кнопок с методом onClick, который запускает действие для результата. Этот метод запускает dialogActivity, которое получает данные от пользователя и отправляет обратно с onActivityResult во фрагмент
Проблема: метод addMateria, вызванный с onClick внутри xml, невозможно объявить его непосредственно внутри фрагмента, и если я объявляю его внутри Activity, которая содержит Fragment, onActivityResult не забирает данные из Dialog, поэтому я думаю, что если запуск метода из Activity соединение между startActivityForResult (внутри Activity) и onAcitivtyResult (внутри Fragment) потеряно.
Единственный / лучший способ это с интерфейсом?
1 ответ
Если вы хотите передать данные между фрагментом и действием, и наоборот, я рекомендую использовать интерфейсы.
Чтобы использовать интерфейсы, я бы изменил ваш код следующим образом:
Сначала определите интерфейс.
public interface FragmentCommunication {
void onAddMateriaClicked(/* Add item(s) you wish to be passed here*/);
}
Затем внедрите указанный интерфейс в свой фрагмент, заменив код, который вы имели в onActivityResult
метод в нашем переопределении onAddMateriaClicked
метод:
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
}
}
}
}
Теперь мы изменим нашу деятельность, чтобы вызвать onAddMateriaClicked
метод, когда кнопка была нажата:
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();
}
}
Сейчас onAddMateriaClicked
будет вызван внутри фрагмента, когда вы нажмете свою кнопку.
Убедитесь, что вы добавляете любые данные, которые хотите передать в качестве параметров, в onAddMateriaClicked
вещь.