Вызовите onActivityResult фрагмента, который находится в представлении пейджерного индекса другого фрагмента. - PullRequest
1 голос
/ 15 марта 2019

У меня есть MainAcitivity, и поверх него у меня есть фрагмент A, который содержит пейджер просмотра с двумя фрагментами B и C ..... Frgamnet B имеет индекс 0 viewpager во фрагменте A и содержит раздел профиля для загрузки профилякартинка из галереи или камеры.Когда выбирается картинка, вызывается результат основной активности onActivity, а затем я перенаправляю его на экземпляр viewpager frgamentA, но моя проблема заключается в том, как вызвать onActivityResult фрагмента B, где основное изображение дисплея должно быть установлено в просмотре изображений??MainAcitivity -> frgamentA -> Фрагмент B

в ожидании положительного ответа ..

FRAGMENTB.java ......

private void galleryIntent() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);//
    check="file";
    startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
      if (check.equalsIgnoreCase("file"))
            onSelectFromGalleryResult(data);
        else if (check.equalsIgnoreCase("camera"))
            onCaptureImageResult(data);
    }
}

MAIN ACTIVITY.java.

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    Fragment f = getSupportFragmentManager().findFragmentById(R.id.frame);
    if (f instanceof FragmentA) {    //fragement A  is viewpager fragment
        f.onActivityResult(requestCode, resultCode, intent);
    }
}

FRAGMENTA.java ............

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    getTargetFragment().onActivityResult(requestCode, resultCode, intent);
}

HI нужно вызвать onActivityResult FragmentB ??

Ответы [ 4 ]

0 голосов
/ 15 марта 2019

Для этого вам лучше позвонить

getParentFragment().startActivityForResult(), 

и в этом родительском фрагменте вы можете реализовать

 onActivityResult()

и в этом методе передайте результат дочернему фрагменту,

  childFragment.getParentFragment().onActivityResult(requestCode, resultCode, data)
0 голосов
/ 15 марта 2019

Вам необходимо позвонить startActivityForResult с запросом кода Я создал пример, он работает нормально, попробуйте.

Файл активности

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;

public class ViewPagerActivity extends AppCompatActivity {

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


        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frameContainer, new FragmentA(), "ft");
        transaction.addToBackStack(null);
        transaction.commit();

    }
}

Фрагмент A

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.Objects;

public class FragmentA extends Fragment {


    ViewPager viewPager;
    ViewPagerAdapter viewPagerAdapter;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.frag_a, container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        viewPager = view.findViewById(R.id.viewPager);
        viewPagerAdapter = new ViewPagerAdapter(Objects.requireNonNull(getActivity()).getSupportFragmentManager());
        viewPager.setAdapter(viewPagerAdapter);

    }

    public class ViewPagerAdapter extends FragmentStatePagerAdapter {
        private int NUM_ITEMS = 2;

        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            switch (i) {
                case 0: // Fragment # 0 - This will show FirstFragment
                    return new FragmentB();
                case 1: // Fragment # 0 - This will show FirstFragment different title
                    return new FragmentC();
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Frag B";
                case 1:
                    return "Frag C";
            }
            return "Page " + position;
        }
    }
}

FragmentB

public class FragmentB extends Fragment {


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.frag_b, container, false);
    }
}

А вот и Фрагмент С , куда вы звоните startActivityForResult

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class FragmentC extends Fragment {

    Button btnSelect;

    int CAMERA_CODE = 1001;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.frag_c, container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        btnSelect = view.findViewById(R.id.btnSelect);


        btnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent cameraI = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraI, CAMERA_CODE);
            }
        });

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CAMERA_CODE) {
            Log.e("got it", "Frag C Got it.");
        }
    }
}
0 голосов
/ 15 марта 2019

Вы должны вызвать startActivityForResult() из компонента, который должен обрабатывать activityResult.

Например:

, если вы хотите обработать результат в Activity myAwesomeActivity:

myAwesomeActivity.startActivityForResult();

если вы хотите обработать результат в Fragment myAwesomeFragment

myAwesomeFragment.startActivityForResult();
0 голосов
/ 15 марта 2019

Если вы хотите вызвать startActivityForResult во фрагменте, сначала вы будете использовать getActivity().

private void galleryIntent() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);//
    check="file";
    getActivity().startActivityForResult(Intent.createChooser(intent, "Select File"), SELECT_FILE);

}
...