Открытие нового фрагмента из ViewPager в Android Studio - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть вопрос об открытии нового фрагмента из ViewPager.

Я настроил FragmentA, FragmentB и Fragment C как фрагменты окна просмотра, а затем приступил к настройке Fragment1 и Fragment2 как фрагментов другого окна просмотра, находящегося во FragmentB.

Таким образом, Fragment1 и Fragment2 находятся в окне просмотра, которое по существу вложено в другое окно просмотра. Я играю со стилями пользовательского интерфейса et c, и это похоже на то, что можно найти в приложении Flickr.

Проблема, с которой я сталкиваюсь, заключается в том, что, как только я попадаю во фрагмент1 или фрагмент2 (вложенный фрагмент), я хочу иметь возможность щелкнуть что-нибудь и ввести полноэкранный фрагмент, минуя панель инструментов, которую я настроил во FragmentB ,

Ниже приведен код, который у меня есть для FragmentB с панелью инструментов, tablayout и viewpager.

package com.app.fragmentdemo;

import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager.widget.ViewPager;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.material.tabs.TabLayout;

public class FragmentB extends Fragment {


    public FragmentB() {
        // Required empty public constructor
    }


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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_b,container,false);

        Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
        TabLayout tabLayout = (TabLayout) rootView.findViewById(R.id.tabs);
        ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.viewPagerFragmentB);

        ViewPagerAdapter adapter = new ViewPagerAdapter(((FragmentActivity) getContext()).getSupportFragmentManager());

        adapter.addFragment(new Fragment1(),"Fragment 1");
        adapter.addFragment(new Fragment2(),"Fragment 2");

        viewPager.setAdapter(adapter);

        tabLayout.setupWithViewPager(viewPager);

        // Inflate the layout for this fragment
        return rootView;
    }
}

Вот код, который я собрал для фрагмента 2, который содержит кнопку, которую я хотел бы чтобы взять меня к другому фрагменту.

package com.app.fragmentdemo;

import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

public class Fragment2 extends Fragment {

    public Fragment2() {
        // Required empty public constructor
    }

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_2,container,false);

        Button button = (Button) rootView.findViewById(R.id.button);

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

                Fragment fragment = new FragmentFull();
                FragmentManager fm = ((FragmentActivity) getContext()).getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.fragmentFullContainer,fragment);
                ft.commit();

                Toast.makeText(getActivity(), "Button Clicked", Toast.LENGTH_SHORT).show();
            }
        });

        // Inflate the layout for this fragment
        return rootView;
    }
}

После нажатия кнопки приложение вылетает. Я получаю сообщение об ошибке:

Не найдено представление для идентификатора 0x7f080084 (com.app.fragmentdemo: id / fragFullContainer) для фрагмента FragmentFull

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

Я очень ценю вашу помощь.

Спасибо.

1 Ответ

0 голосов
/ 06 апреля 2020

В следующей строке

ft.add(R.id.fragmentFullContainer,fragment);

fragmentFullContainer должно быть представлением в вашем R.layout.fragment_2

Вы получаете cra * sh, поскольку ОС не может найти fragmentFullContainer в R.layout.fragment_2

ОБНОВЛЕНИЕ

заменить getSupportFragmentManager на getChildFragmentManager

Если вы хотите полноэкранный режим, вы должны вручную скрыть элементы Activity View.

Скорее всего, у вас есть панель инструментов из действия, вы можете удалить ее вот так.

((AppCompatActivity)getActivity()).getSupportActionBar().hide();
...