onActivityResult不会将数据带回Fragment中

时间:2016-09-16 15:33:56

标签: android fragment onactivityresult

我有80个不同的Buttons具有不同的ID,所以我设置了android:"onClick" = addMateria;,但问题是我使用Fragment并且他无法在Fragment内看到方法addMateria。

所以我把方法放在包含Activity的{​​{1}}内。 此方法调用startActvityForResult,Fragment将数据恢复。

问题在于片段不会带回任何东西。 我读了一些建议使用Fragment或简单调用super.onActivityResult的帖子,但没有任何变化!

管理所有碎片的Activity内部的方法

StartActivityForResult

这是Fragment中的onActivityResult

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

为什么方法无法启动,我无法将收到的数据保存在数据库中?

我有什么: 它的视图片段由80个按钮和一个onClick方法组成,它为结果启动一个Activity。 此方法启动一个dialogActivity,它从用户获取数据并使用onActivityResult发送回Fragment

问题: 使用onClick在xml内部调用addMateria方法,不可能直接在片段内声明它,如果我在包含Fragment的Activity中声明它,onActivityResult不会从Dialog中取回数据,所以我认为如果方法从Activity开始startActivityForResult(在Activity内)和onAcitivtyResult(在Fragment内)之间的连接丢失。

接口的唯一/最佳方式?

1 个答案:

答案 0 :(得分:0)

如果您希望在片段和活动之间传递数据,反之亦然,我建议使用接口。

要使用接口,我会像这样修改你的代码:

首先定义界面。

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项目。