Свернуть фрагмент при повторном нажатии TextView. Показывает фрагмент на клике, но не скрывает его при втором клике - PullRequest
0 голосов
/ 01 мая 2020

У меня есть страница Activity с 4 различными элементами, которые являются фрагментами, для которых я создал контейнеры под их соответствующими заголовками. OnClick Я хочу, чтобы фрагмент открылся и еще раз щелкнул по его названию, и я бы хотел, чтобы этот фрагмент закрылся.

По какой-то причине написанный мною код открывает фрагмент точно так же, как он должен располагаться прямо под заголовком, но второй щелчок по заголовку, который должен закрыть / скрыть / свернуть фрагмент, отсутствует. не делаю так.

Я не был уверен, должен ли я искать контейнер в findViewById или фактическое имя фрагмента ... Имеет смысл, чтобы это был реальный контейнер, а не имя фрагмента.

Что я должен изменить, чтобы это работало?

SettingsActivity

mPrivacy.setOnClickListener(v -> {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.container_privacy, new PrivacyFragment(), null).addToBackStack(null).commit();

            Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container_privacy);
            if (fragment != null)
                if (fragment.isVisible()) {
                    fragmentTransaction.hide(fragment).commit();
                } else {
                    fragmentTransaction.show(fragment).commit();
                }
        });

        mSecurity.setOnClickListener(v -> {
            //Create Security Fragment
        });

        mHelp.setOnClickListener(v -> {
            //Create Help Fragment
        });

        mAbout.setOnClickListener(v -> {
            //Create About Fragment
        });

        getUserInfo();
    }

Я тоже так пробовал, но все равно не закроется после его открытия.

Второй метод

 mPrivacy.setOnClickListener(v -> {


   FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.container_privacy, new PrivacyFragment(), null).addToBackStack(null);
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container_privacy);
    if (fragment != null) {
        if (fragment.isHidden()) {
            fragmentTransaction.show(fragment);
        } else {
            fragmentTransaction.hide(fragment);
        }
    }
    fragmentTransaction.commit();
});

Этот последний метод действительно работает и делает то, что я хочу, но просто задаюсь вопросом, является ли это хорошим способом go о Это. Видел некоторые посты, в которых говорится, что не стоит связываться с Visibility Интересно почему? Имеет ли это значение?

Третий метод

mPrivacy.setOnClickListener(v -> {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.container_privacy, new PrivacyFragment(), null).addToBackStack(null).commit();

            if (mFrameLayout.getVisibility() == View.GONE) {
                mFrameLayout.setVisibility(View.VISIBLE);
            } else {
                mFrameLayout.setVisibility(View.GONE);
            }
        });

1 Ответ

1 голос
/ 01 мая 2020

Это самое простое решение, которое я нашел. Попробуйте поместить фрагмент в FrameLayout и просто показать / скрыть FrameLayout

            <FrameLayout
            android:layout_width="match_parent"
            android:visibility="gone"
            android:id="@+id/frame_id"
            android:layout_height="wrap_content">
            <fragment
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"/>
        </FrameLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...