@evgeniyleventsov

Как передать данные из DialogFragment в вызвавшую его activity?

Прошу помочь кодом и объяснениями, то есть на моём примере и тыкнуть пальцем, что куда и как.
Как передать данные из DialogFragment в обычную activity, которая вызывала этот диалог?

В обратную сторону с помощью setArguments в activity и getArguments в DialogFragment. А как вытащить данные из DialogFragment? В моём случае нужно вытащить значение NumberPicker'a

MainActivity
...
public class MainActivity extends ActionBarActivity {
    DialogFragment dlg1;
    DialogFragment dlg2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv=(TextView)findViewById(R.id.t_v);

        dlg1 = new dialog1();
        dlg2 = new dialog2();

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnDlg1:

                dlg1.show(getFragmentManager(), "dlg1");

                break;
            case R.id.btnDlg2:
                dlg2.show(getFragmentManager(), "dlg2");
                break;
            default:
                break;
        }

    }

}


public class dialog1 extends DialogFragment implements OnClickListener {

    final String LOG_TAG = "myLogs";
    String num;
    Integer numm;
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        getDialog().setTitle("Title!");
        View v = inflater.inflate(R.layout.dialog1, null);
        TextView tv= (TextView)v.findViewById(R.id.textView1);
        NumberPicker np= (NumberPicker)v.findViewById(R.id.n_p);
        v.findViewById(R.id.btnYes).setOnClickListener(this);
        v.findViewById(R.id.btnNo).setOnClickListener(this);
        v.findViewById(R.id.btnMaybe).setOnClickListener(this);
        tv.setText("");
        np.setMinValue(50);
        np.setMaxValue(100);
        
        
        num = getArguments().getString("index");
        tv.setText(num);

        numm=np.getValue();




        return v;
    }

    public static interface OnCompleteListener {
        public abstract void onComplete(String time);
    }

    private OnCompleteListener mListener;

    // make sure the Activity implemented it
    public void onAttach(Activity activity) {
        try {
            this.mListener = (OnCompleteListener)activity;
        }
        catch (final ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnCompleteListener");
        }
    }

    public void onClick(View v) {
        Log.d(LOG_TAG, "Dialog 1: " + ((Button) v).getText());



        Bundle args = new Bundle();
        setArguments(args);
        dismiss();
    }

    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        Log.d(LOG_TAG, "Dialog 1: onDismiss");
    }

    public void onCancel(DialogInterface dialog) {
        super.onCancel(dialog);
        Log.d(LOG_TAG, "Dialog 1: onCancel");
    }
  • Вопрос задан
  • 8423 просмотра
Решения вопроса 1
VYakushev
@VYakushev
Разработчик Android в Nowtaxi
В вашем коде есть почти всё необходимое. В фрагменте объявлен интерфейс OnCompleteListener и в методе onAttach() полю mListener произведена попытка присвоить ссылку на вызвавшую фрагмент активность. Всё что необходимо доработать в данном случае следующее:
1. В методе onClick() вызвать mListener.onComplite();
2. Прописать у активити, что она реализует интерфейс OnCompleteListener. Тогда будет предложено обязательно описать в классе активити метод onComplite(String value).
Если вам нужно передавать не строковое значение, а что-то иное (а судя по задаче требуется число), то нужно изменить тип параметра в методе onComplite() у интерфейса OnCompleteListener.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы