Не получается получить данные с DialogFragment

182
11 октября 2018, 14:30

Есть адаптер который генерирует и обрабатываете клики по елементам, из него вызывается при нажатии на картинку fragmentDialog в котором есть edittext. Мы вводим данные туда и нажимаем к примеру "готово" или "отмена" в диалоге - и нам нужно передать данные туда, откуда этот диалог был вызван. Помогите пожалуйста правильно получить данные. Код фрагмента:

public class DialogFragmentAddToLike extends DialogFragment
    implements DialogInterface.OnClickListener{
public static String COMMENT = "Немає конментару";
public static int TYPE_RESULT = 0;
View view;
EditText etComment;
public interface OnButtonClick {
    void getResultListener(String comment, int typeResult);
}
public  OnButtonClick listener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = getActivity().getLayoutInflater();
    view = 
inflater.inflate(R.layout.comment_dialog_fragment_edit_text_layout, null);
    etComment = view.findViewById(R.id.etCommentContact);
    AlertDialog.Builder adb = new AlertDialog.Builder(getActivity())
            .setTitle("Ваш коменр:")
            .setPositiveButton(R.string.yes, this)
            .setNegativeButton(R.string.no,  this)
            .setView(view);
    return adb.create();
}
@Override
public void onClick(DialogInterface dialog, int which) {
    switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            if(!etComment.getText().toString().isEmpty()){
                COMMENT = etComment.getText().toString();
            }
            TYPE_RESULT = 1;
            //listener.getResultListener(COMMENT, 1);
            Log.println(Log.INFO, "api", "dialog " + COMMENT);
            break;
        case DialogInterface.BUTTON_NEGATIVE:
            TYPE_RESULT = 0;
            //listener.getResultListener(COMMENT, 0);
            break;
    }
}
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    listener.getResultListener(COMMENT, TYPE_RESULT);
    try { listener = (OnButtonClick) getActivity(); }
    catch (ClassCastException e) { throw new 
ClassCastException(context.toString() + " must implement OnButtonClick"); }
}
}

Вызов диалога:

@Override
@SuppressLint("RecyclerView")
public void onBindViewHolder(@NonNull final ViewHolder holder, final int 
position) {
    String fullName = contactItemList.get(position).getLast_name() + " " + 
 contactItemList.get(position).getFirst_name();
    holder.pib.setText(fullName);
    holder.misce_rob.setText(contactItemList.get(position).getMisce_rob());
    holder.addToLike.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String s = context.getString(R.string.like);
            if(holder.addToLike.getTag().equals(s)){
                holder.addToLike.setImageResource(R.drawable.star_contact);
                holder.addToLike.setTag(context.getString(R.string.like_1));
                DialogFragmentAddToLike dialog = new 
  DialogFragmentAddToLike();
                dialog.show(fragmentManager, "dialog add to like");
                //getResultListener(DialogFragmentAddToLike.COMMENT, 
  //DialogFragmentAddToLike.TYPE_RESULT);
                // ПОЛУЧИТЬ ДАННЫЕ ДИАЛОГА
                Log.println(Log.INFO, "api", "holder " +comment);
                //dialog.onClick();
                // not comment ------------------ Log.println(Log.INFO, 
  "api", comment);
            }
        }
    });
    holder.openPDF.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context, "open pdf: "+
                    contactItemList.get(position).getLink_pdf(), 
  Toast.LENGTH_SHORT).show();
        }
    });
    if(TYPE_VIEW != 0){
        holder.change.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // change comment by id
            }
        });
    }
}

Как после открытия диалога "ждать" пока он не закроется и тогда получить данные?

Answer 1
    Попробуйте вместо возьни с интерфейсами при клике на айтем из адаптера передавать в диалог фрагмент new Concumer(). RxJava2.
    вашДиалог.newInstance(objectId, new Consumer<String> (){
    @Override
        public void accept(String message) throws Exception {
        doSomethingWithMessage(message);
       }
    })
а в диалоге когда реализуете RxTextView из RxBindings
 subscription = RxTextView.textChanges(etCancelComment)
                          .filter(charSequence -> charSequence.length() < 256)
                          .subscribe(charSequence -> {
                               if (charSequence.toString().length() > 10) {
                                   consumer.accept(charSequence)
                                    } else {
                                        Toast."Мало текста. Бла бла"
                                    }
                                });

Из newInstance вытащите Consumera для вставки в RxTextView

Answer 2

Создайте интерфейс:

public interface CustomDialogInterface {
void okButtonClicked(String  value);
}

DialogFragment:

public class MyAlert extends DialogFragment implements OnClickListener {
private EditText getEditText;
MainActivity callBackActivity;
CustomDialogInterface customDI;
public MyAlert(CustomDialogInterface customDI)
{
this.customDI = customDI;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
callBackActivity = new MainActivity();
getEditText = new EditText(getActivity());
getEditText.setInputType(InputType.TYPE_CLASS_TEXT);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Get UserName :");
builder.setMessage("Enter Your Name :");
builder.setPositiveButton("Ok", this);
builder.setNegativeButton("Cancel", null);
builder.setView(getEditText);
return builder.create();
}
@Override
public void onClick(DialogInterface dialog, int which) {
String value = getEditText.getText().toString();
Log.d("Name : ", value);
dialog.dismiss();
customDI.okButtonClicked(value);
}
}

Вызов диалога:

public void showMyAlert(View view) {
MyAlert myAlert = new MyAlert(this);
myAlert.show(getFragmentManager(), "My New Alert");

}

Имплементируйте интерфейс CustomDialogInterface в MainActivity и переопределите метод okButtonClicked()

READ ALSO
Переход из фрагмента в активити по кнопке

Переход из фрагмента в активити по кнопке

Не получается реализовать переход из фрагмента в активити по кнопкеПерерыв весь интернет, решила попросить о помощи, т

169
Как реализовать общение двух и больше компьютеров в java?

Как реализовать общение двух и больше компьютеров в java?

как реализовать общение между двумя и больше компьютеров? Читал что нужно использовать сокеты, но возможно есть и другой вариант? Раньше...

135
Вопрос связанный с методом Multiple

Вопрос связанный с методом Multiple

Можете помочь написать метод Multiple который создает две матрицы и умножает их

190