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 вещь.

Другие вопросы по тегам