george oprian
george oprian

Reputation: 21

How do I get Toast messages to show up when a response is received from the server in my Android app with TabLayout and ViewPager?

I am trying to implement a tab layout in my Android app using TabLayout and ViewPager. I have a fragment with tabbed layout. The problem is that when I perform a call to my server I want to display a message using a Toast, but the message is not displayed.

I defined the Parent Fragment as follows:

public class BookDetailsTabbedFragment extends Fragment {

    private PagerAdapter pagerAdapter;

    private TabLayout tableLayout;
    private ViewPager viewPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_book_details_tabbed, container, false);

        tableLayout = view.findViewById(R.id.tab_layout);

        viewPager = view.findViewById(R.id.view_pager);
        tableLayout.setupWithViewPager(viewPager);

        pagerAdapter = new PagerAdapter(getChildFragmentManager(),      FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

        BookDetailsFragment bookDetailsFragment = new BookDetailsFragment();
        bookDetailsFragment.setArguments(getArguments());

        ReviewsFragment reviewsFragment = new ReviewsFragment();
        reviewsFragment.setArguments(getArguments());

        pagerAdapter.initAdapter();
        pagerAdapter.addFragment(bookDetailsFragment, "Details");
        pagerAdapter.addFragment(reviewsFragment, "Reviews");

        viewPager.setAdapter(pagerAdapter);

        return view;
    }
}

The tabs of the previous fragment are also fragments and in one of the tabs I have the following code:

BookRentRequestDto bookRentRequestDto = getBookRentRequestDto();
        Call<BookRentResponseDto> call = WebServerAPIBuilder.getInstance().createSubscription(bookRentRequestDto);
        call.enqueue(new Callback<BookRentResponseDto>() {
            @Override
            public void onResponse(Call<BookRentResponseDto> call, retrofit2.Response<BookRentResponseDto> response) {
                if (response.isSuccessful()) {
                    Toast.makeText(getContext(), "Book rented", Toast.LENGTH_LONG).show();
                } else if (response.code() == 404) {
                    Toast.makeText(getContext(), "There are no volumes available in stock for this book. Sorry to inform you.", Toast.LENGTH_LONG).show();
                } else if (response.code() == 403) {
                    Toast.makeText(getContext(), "You have already rented this book", Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<BookRentResponseDto> call, Throwable t) {
                Toast.makeText(getContext(), t.getMessage(), Toast.LENGTH_LONG).show();
            }
        });

Why the Toast is not displaying anything?

My assumption is that when Toast.makeText(getContext(), "Book rented", Toast.LENGTH_LONG).show() get's called the fragment does not use the right context. But when I tried to replace getContext() with getActivity() nothing changed. I also tried to use getActivity().runOnUiThread(() -> Toast.makeText(getActivity(), "Book rented", Toast.LENGTH_LONG).show()), but the result was the same.

Upvotes: 1

Views: 63

Answers (0)

Related Questions