Как получить данные из Dialogfragment во фрагмент с интерфейсом - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь получить данные из диалогового фрагмента во фрагмент, передавая их через интерфейс. До сих пор я знаю, что сначала, потому что его фрагмент мне нужно реализовать интерфейс на MainActivity и оттуда отправить данные в любой фрагмент, который я хочу , Я понимаю это, но я не знаю, как это сделать. Пока что я реализовал в MainActivity интерфейс, я получаю данные, но я не знаю, как отправить их во фрагмент.

Основная деятельность

     public class MainActivity extends AppCompatActivity
    implements ChangeProfileImgDialog.OnPhotoReceivedListener{
    //these the methods that i implement
       @Override
public void getImagePath(Uri imagePath) {
    Log.d("imagepath",imagePath.toString());
}

@Override
public void getImageBitmap(Bitmap bitmap) {
    Log.d("imagepath",bitmap.toString());
}

Фрагмент диалога - этот фрагмент диалога получает изображение из галереи / камеры

  public class ChangeProfileImgDialog extends DialogFragment {

      public interface OnPhotoReceivedListener{
    public void getImagePath(Uri imagePath);
    public void getImageBitmap(Bitmap bitmap);


}

OnPhotoReceivedListener mOnPhotoReceived;

     @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    /*
    Results when selecting new image from phone memory
     */
    if(requestCode == PICKFILE_REQUEST_CODE && resultCode == Activity.RESULT_OK){
        Uri selectedImageUri = data.getData();
        Log.d(TAG, "onActivityResult: image: " + selectedImageUri);
            //send the uri and fragment to the interface
            mOnPhotoReceived.getImagePath(selectedImageUri);
            getDialog().dismiss();
    }

    else if(requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK){
        Log.d(TAG, "onActivityResult: done taking a photo.");

        Bitmap bitmap;
        bitmap = (Bitmap) data.getExtras().get("data");
        //send the bitmap and fragment to the interface
        mOnPhotoReceived.getImageBitmap(bitmap);
        getDialog().dismiss();
    }
}

@Override
public void onAttach(Context context) {
    try{
        mOnPhotoReceived = (OnPhotoReceivedListener)this.getActivity();
    }catch (ClassCastException e){
        Log.e(TAG, "onAttach: ClassCastException: " + e.getMessage(), e.getCause() );
    }
    super.onAttach(context);
}

Фрагмент - этот фрагмент должен получить данные из фрагмента диалога. но это должно исходить от MainActivity.

    public class MyAccountFragment extends Fragment implements View.OnClickListener,
                                       ChangeProfileImgDialog.OnPhotoReceivedListener{

  @Override
public void getImagePath(Uri imagePath) {
    if( !imagePath.toString().equals("")){
        mSelectedImageUri = imagePath;
        mSelectedImageBitmap = null;
        Log.d(TAG, "getImagePath: got the image uri: " + mSelectedImageUri);
    }
}

@Override
public void getImageBitmap(Bitmap bitmap) {
    if(bitmap != null){
        mSelectedImageUri = null;
        mSelectedImageBitmap = bitmap;
        Log.d(TAG, "getImageBitmap: got the image bitmap: " + mSelectedImageBitmap);
    }
}

Надеюсь, вы меня поняли. То, что я пытаюсь сделать, - это просто передать данные из фрагмента диалога во фрагмент. Поскольку его фрагмент и я использую интерфейс, мне нужно реализовать этот интерфейс в MainActivity, а затем кое-как переместить данные во фрагмент. Любая идея, как мне переместить данные во фрагмент?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Прежде всего создайте интерфейс

public interface CallBackInterface{
    public void OnCustomerDetailsCallback(String getDetailsData);
}

Затем внедрите этот интерфейс в свой MyAccountFragment

Вызовите DialogFragment, как это, из MyAccountFragment

 android.support.v4.app.FragmentManager fm=getActivity().getSupportFragmentManager();
        dialogFragment dFragment = new dialogFragment ();
        if (dFragment != null) {
            dFragment.onAttachToParentFragment(this);
        }
        dFragment.setArguments(bundle);
        dFragment.show(fm, "Dialog Fragment");

 }

в вашем диалоговом окне FragmendFragment

   public void onAttachToParentFragment(CallBackInterface callBackInterface) {
        if (callBackInterface != null) {
            try {
                this.callBackInterface= callBackInterface;
            } catch (ClassCastException e) {
                throw new ClassCastException(
                        callBackInterface.toString() + " must implement Callback");
            }
        }

Используйте функцию обратного вызова в нужном вам месте во фрагменте диалога

callBackInterface.onClickAtOKButton(your data);
0 голосов
/ 11 сентября 2018

Вы можете добавить проверку на фрагмент. Всякий раз, когда вы получаете обратный вызов в переопределенных методах в MainActivity используйте getSupportFragmentManager().findFragmentById(pass the id of the container) или можете использовать getSupportFragmentManager().findFragmentByTag(pass your fragment tag name) следующим образом: -

Fragment fragment = getSupportFragmentManager().findFragmentById(//pass the id of the container)
if(fragment instanceOf MyAccountFragment){
//after this 
fragment.sendDataToFragment(//Your data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...