Как вернуть данные из BottomSheetDialogFragment в родительский фрагмент - PullRequest
0 голосов
/ 20 января 2019

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

Как передать объект класса (модели), содержащий данные из BottomSheetDialogFragment, во фрагмент, в котором был создан экземплярBottomSheetDialogFragment на.Вот мой код

Фрагмент. Я хочу автоматически заполнить поля

public class FormFragment extends Fragment implements onItemSelected {public class fetchSimilarContacts extends AsyncTask<Void, Void, String> {
    String result, res, search;

    fetchSimilarContacts(String sear){
        search = sear;
    }

    @Override
    protected void onPostExecute(String aVoid) {
        try {
            if (res.equals("200")){
                try {
                    // bring up bottom sheet
                    bottomSheetDialogFragment = new formBottomSheet();
                    Bundle bun = new Bundle();
                    bun.putParcelableArrayList("data", contItems);
                    bottomSheetDialogFragment.setArguments(bun);
                    bottomSheetDialogFragment.show(getActivity().getSupportFragmentManager(), bottomSheetDialogFragment.getTag());
                }
                catch (Exception ex){
                    ex.printStackTrace();
                }
            }
            else{
                Toast.makeText(getActivity().getApplicationContext(), "Could not connect to server", Toast.LENGTH_LONG).show();
            }
        }
    }

}}

Я получаю данные и заполняю RecyclerView с помощью функции asynctask, описанной выше.Вот класс formBottomSheet

public class formBottomSheet extends BottomSheetDialogFragment{

similarContactAdapter mAdapter;
RecyclerView rec;
ArrayList<hash> contItems;
View v;
onItemSelected itemSelected;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //contItems = new ArrayList<hash>();
    if(getArguments() != null){
        contItems = getArguments().getParcelableArrayList("data");
    }
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    /*return super.onCreateView(inflater, container, savedInstanceState);*/
    v = inflater.inflate(R.layout.form_bottomsheet_recyclerview, container, false);

    rec = (RecyclerView) v.findViewById(R.id.recycler);
    itemSelected = (onItemSelected) getParentFragment();
    //contItems = new ArrayList<hash>();
    mAdapter = new similarContactAdapter(contItems, getActivity().getApplicationContext(), new similarContactAdapter.onItemClickListener() {
        @Override
        public void onItemClick(hash hsh) {
            //after clicking on an item in the RecyclerView, i get the item's data here, how to i pass the data from here to the Form Fragment where i instantiated the bottom sheet fragment dialog?
            Toast.makeText(getActivity().getApplicationContext(), "",  Toast.LENGTH_LONG).show();
        }
    });
    final RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
    rec.setLayoutManager(mLayoutManager);
    rec.setItemAnimator(new DefaultItemAnimator());
    rec.setAdapter(mAdapter);
    mAdapter.notifyDataSetChanged();
    return v;
}

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
}

public interface onItemSelected {
    void SendHashItem(hash hsh);
}   }

после нажатия на элемент в RecyclerView, я получаю здесь данные элемента, как мне передать данные отсюда во фрагмент формы, где я создал экземпляр BottomSheetFragmentDialog?

Вот моя деятельность

protected void onCreate(Bundle savedInstanceState) {
    try{
        super.onCreate(savedInstanceState);

        // Hide the status bar.
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_dashboard);

        //initialize
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        viewPager = (ViewPager) findViewById(R.id.viewp);
        setupViewPager(viewPager);
        title = findViewById(R.id.title);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(getApplicationContext(), R.color.transparent));

        setupTabIcons();

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {

                View tabView = tab.getCustomView();

                // get inflated children Views the icon and the label by their id
                TextView tab_label = (TextView) tabView.findViewById(R.id.tab);

                // change the label color, by getting the color resource value
                tab_label.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary));
                // change the image Resource
                // i defined all icons in an array ordered in order of tabs appearances
                // call tab.getPosition() to get active tab index.
                tab_label.setCompoundDrawablesWithIntrinsicBounds(0, tabIconsActive[tab.getPosition()], 0, 0);
                //"#4CAF50");
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                View tabView = tab.getCustomView();

                // get inflated children Views the icon and the label by their id
                TextView tab_label = (TextView) tabView.findViewById(R.id.tab);

                // change the label color, by getting the color resource value
                tab_label.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.white));
                // change the image Resource
                // i defined all icons in an array ordered in order of tabs appearances
                // call tab.getPosition() to get active tab index.
                tab_label.setCompoundDrawablesWithIntrinsicBounds(0, tabIcons[tab.getPosition()], 0, 0);
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                tabLayout.setScrollPosition(position, 0 , true);
                tabLayout.setSelected(true);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        viewPager.setCurrentItem(0);
        tabLayout.getTabAt(0).select();
        setToolbarTitle();
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new VideoFragment(), "Video");
    adapter.addFragment(new ThreeSixtyFragment(), "360");
    adapter.addFragment(new FormFragment(), "Form");
    adapter.addFragment(new SettingsFragment(), "Settings");
    viewPager.setAdapter(adapter);
}

private void setupTabIcons() {
    TextView tabThree = (TextView) LayoutInflater.from(this).inflate(R.layout.cust_tab, null);
    tabThree.setText("Video");
    tabThree.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary));
    tabThree.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_video_red, 0, 0);
    tabLayout.getTabAt(0).setCustomView(tabThree);

    TextView tabTwo = (TextView) LayoutInflater.from(this).inflate(R.layout.cust_tab, null);
    tabTwo.setText("360");
    tabTwo.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_360_white, 0, 0);
    tabLayout.getTabAt(1).setCustomView(tabTwo);

    TextView tabOne = (TextView) LayoutInflater.from(this).inflate(R.layout.cust_tab, null);
    tabOne.setText("Form");
    tabOne.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_form_white, 0, 0);
    tabLayout.getTabAt(2).setCustomView(tabOne);

    TextView tabFive = (TextView) LayoutInflater.from(this).inflate(R.layout.cust_tab, null);
    tabFive.setText("Settings");
    tabFive.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_settings_white, 0, 0);
    tabLayout.getTabAt(3).setCustomView(tabFive);
}

@Override
public void onFragmentInteraction(Uri uri) {

}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

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

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

1 Ответ

0 голосов
/ 20 января 2019

И ваши FormFragment, и ваши formBottomSheet являются фрагментами, которые находятся внутри одного и того же экземпляра Activity.

Иногда фрагмент может иметь «родительский» или «дочерний» фрагменты, но здесь это не так.потому что ваш FormFragment использует getActivity().getSupportFragmentManager() для отображения нижнего листа, а не getChildFragmentManager().Это совершенно нормально, но об этом нужно помнить.

Это означает, что лучший способ для formBottomSheet "поговорить" с FormFragment - это вместо этого поговорить с Заданием и затем получитьПерейдите к действию, а затем FormFragment.

formBottomSheet -> Activity -> FormFragment

Говорить с заданием довольно легко.Вы можете просто позвонить по номеру getActivity() и привести его к какому-либо названию класса вашей Деятельности:

mAdapter = new similarContactAdapter(contItems, getActivity().getApplicationContext(), new similarContactAdapter.onItemClickListener() {
    @Override
    public void onItemClick(hash hsh) {
        MyActivity activity = (MyActivity) getActivity();
        activity.onHashItem(hsh);
    }
});

Внутри своей Деятельности вы можете использовать FragmentManager, чтобы получить ваш FormFragment, а затем отправить сообщение вместе с ним.к этому.Это зависит от FormFragment, имеющего либо id (если вы установили атрибут android:id в XML или если вы использовали replace(R.id.some_id, ...), то вы можете использовать идентификатор), либо tag (если вы установилиАтрибут android:tag для него в XML или, если вы использовали replace(..., "TAG"), то вы можете использовать тег).

public void onHashItem(hash hsh) {
    FragmentManager fm = getSupportFragmentManager();

    // use only one of the two following lines
    FormFragment fragment = (FormFragment) fm.findFragmentById(R.id.some_id); // if using id
    FormFragment fragment = (FormFragment) fm.findFragmentByTag("TAG"); // if using tag

    fragment.onHashItem(hsh);
}

Наконец, вы можете создать метод onHashItem() в вашем FormFragment:

public void onHashItem(hash hsh) {
    // do whatever you want
}
...