onBackPressed (); не работает, если я не вызываю super.onBackPressed (); дважды в коде - PullRequest
0 голосов
/ 04 августа 2020

У меня проблемы с методом onBackPressed();. Мне нужно, чтобы значки BottomNavView менялись в зависимости от того, какой Fragment пользователь попадает при вызове onBackPressed();. Этого сейчас не происходит с кодом, который у меня есть. Я пробовал несколько разных способов реализовать этот код, но ничего не помогло. Итак, два самых больших результата, которые я получаю, - это если я дважды назову super.onBackPressed(); изменение BNV icons, НО изображения в одном из моих Fragments вернутся дублированными, и я не знаю, почему ...

Итак, если я избавлюсь от одного из onBackPressed();, значки BNV не меняются на onBackPressed();

, я подумал, что, возможно, мне следует изменить instanceOf in onBackPressed(); на polymorphism. .. Я видел, что это то, что люди сделали вместо instanceOf ... Я не знаю, решит ли это мою проблему. Может ли кто-нибудь сообщить мне, что они думают?

Может, есть onBackPressedListener or fragmentListener, который я мог бы реализовать, чтобы этот код работал?

Самое странное, что изображения возвращаются вдвое всего за ОДИН из моих фрагментов ... Все остальные в порядке.

MainActivity

private BottomNavigationView.OnNavigationItemSelectedListener navigationItemSelectedListener = menuItem -> {
        switch (menuItem.getItemId()) {
            case R.id.nav_home:
                mSelectedFragment = new TabLayoutFragment();
                break;
            case R.id.nav_notifications:
                seenNotification();
                mSelectedFragment = new NotificationsFragment();
                break;
            case R.id.nav_profile:
                SharedPreferences.Editor editor = getSharedPreferences("PREFS", MODE_PRIVATE).edit();
                editor.putString("profileid", mFirebaseUser.getUid());
                editor.apply();
                mSelectedFragment = new ProfileFragment();
                break;
            case R.id.nav_save:
                mSelectedFragment = new AttendingEventFragment();
                break;
        }

        if (mSelectedFragment != null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, mSelectedFragment, null).addToBackStack(null).commit();
        }

        return true;
    };

     @Override
    public void onBackPressed() {
        if (mDrawer.isDrawerOpen(GravityCompat.START)) {
            mDrawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }

        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if (fragment instanceof TabLayoutFragment) {
            mBottomNavigationView.setSelectedItemId(R.id.nav_home);
        } else if (fragment instanceof AttendingEventFragment) {
            mBottomNavigationView.setSelectedItemId(R.id.nav_save);
        } else if (fragment instanceof NotificationsFragment) {
            mBottomNavigationView.setSelectedItemId(R.id.nav_notifications);
        } else if (fragment instanceof ProfileFragment) {
            mBottomNavigationView.setSelectedItemId(R.id.nav_profile);
        }
        super.onBackPressed();
    }

EventFragment ЭТО ОДИН ГДЕ ИЗОБРАЖЕНИЯ ВЕРНУТЬСЯ В ДВОЙНОЙ. ТОЛЬКО ОДИН, ГДЕ ЭТО ПРОИСХОДИТ ...

public class AttendingEventFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

    private List<String> mEvent;
    private List<Post> mPostList;

    private String mPostId;

    private EventsImagesAdapter mEventsImagesAdapter;
    private FirebaseUser mFirebaseUser;

    private TextView mNoEvents;
    private ImageView mBackArrow;

    private SwipeRefreshLayout mSwipeRefreshLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_attending_event, container, false);

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        mNoEvents = view.findViewById(R.id.no_events);

        mBackArrow = view.findViewById(R.id.arrow_back);

        SharedPreferences sharedPreferences = getContext().getSharedPreferences("PREFS", Context.MODE_PRIVATE);
        mPostId = sharedPreferences.getString("postid", "none");

        RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new GridLayoutManager(getContext(), 3);
        recyclerView.setLayoutManager(linearLayoutManager);
        mPostList = new ArrayList<>();
        mEventsImagesAdapter = new EventsImagesAdapter(getContext(), mPostList);
        recyclerView.setAdapter(mEventsImagesAdapter);

        ((DrawerLocker) getActivity()).setDrawerLocked(true);

        mSwipeRefreshLayout = view.findViewById(R.id.refresh);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        mSwipeRefreshLayout.post(() -> {
            mSwipeRefreshLayout.setRefreshing(true);
            mySaves();
        });

        setBackArrow();

        return view;
    }

    @Override
    public void onDestroy() {
        ((DrawerLocker) getActivity()).setDrawerLocked(false);
        super.onDestroy();
    }

    private void mySaves() {
        mEvent = new ArrayList<>();
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Attending Event");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    if (snapshot.hasChild(mFirebaseUser.getUid()))
                        mEvent.add(snapshot.getKey());
                }

                Log.d("READSAVES", String.valueOf(mEvent));
                readSaves();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void readSaves() {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mPostList.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Post post = snapshot.getValue(Post.class);
                    for (String id : mEvent) {
                        if (post != null)
                            if (post.getPostid().equals(id)) {
                                mPostList.add(post);
                            }
                    }
                }

                Log.d("SAVES", mPostList.toString());

                if (mPostList.size() == 0) {
                    mNoEvents.setVisibility(View.VISIBLE);
                } else {
                    mNoEvents.setVisibility(View.GONE);
                }

                mEventsImagesAdapter.notifyDataSetChanged();
                Collections.reverse(mPostList);
                mSwipeRefreshLayout.setRefreshing(false);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                mSwipeRefreshLayout.setRefreshing(false);

            }
        });
    }

    private void setBackArrow() {
        mBackArrow.setOnClickListener(v -> getActivity().getSupportFragmentManager().popBackStack());
    }

    @Override
    public void onRefresh() {
        mySaves();
    }
}

1 Ответ

1 голос
/ 04 августа 2020

super.onBackPressed() вызовет желаемое поведение обратного нажатия. И вы дважды звоните в своем коде. ваш код должен выглядеть, как показано ниже.

@Override
        public void onBackPressed () {
            if (mDrawer.isDrawerOpen(GravityCompat.START)) {
                mDrawer.closeDrawer(GravityCompat.START);
                return;
            }
            super.onBackPressed();
            Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
            if (fragment instanceof TabLayoutFragment) {
                mBottomNavigationView.setSelectedItemId(R.id.nav_home);
            } else if (fragment instanceof AttendingEventFragment) {
                mBottomNavigationView.setSelectedItemId(R.id.nav_save);
            } else if (fragment instanceof NotificationsFragment) {
                mBottomNavigationView.setSelectedItemId(R.id.nav_notifications);
            } else if (fragment instanceof ProfileFragment) {
                mBottomNavigationView.setSelectedItemId(R.id.nav_profile);
            }
        }

Теперь, если вы получите правильный фрагмент из стека с помощью #findFragmentById, он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...