Замена FragmentContainerView по нажатию на TextView

250
15 апреля 2022, 11:10

У меня есть 4 TextView и FragmentContainerView.

FragmentContainerView с помощью app:navGraph="@navigation/mobile_navigation" обращается к navigation. Мне нужно чтобы по нажатию на одну из TextView менялись фрагменты находящиеся в "@navigation/mobile_navigation". То есть по нажатию на TextView1 в FragmentContainerView виден 'Fragment1', по нажатию на TextView2 в FragmentContainerView виден 'Fragment2' и т.д.

По сути это BottomNavigationView только не через menu.

Я построил архитектуру того как будет выглядеть xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <View
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:background="@color/color_1" />
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/llmain"
        android:layout_below="@+id/view"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginStart="0dp"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="0dp"
        android:layout_marginEnd="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginBottom="0dp"
        app:defaultNavHost="true"
        app:itemRippleColor="@color/color_2"
        app:navGraph="@navigation/mobile_navigation" />
    <LinearLayout
        android:id="@+id/llmain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="0dp"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:layout_gravity="bottom"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/attraction_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/Attraction"
                android:textColor="@android:color/holo_red_dark"
                android:textSize="12sp" />
            <TextView
                android:id="@+id/rink_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/Rink"
                android:textColor="@color/color_0"
                android:textSize="12sp" />
            <TextView
                android:id="@+id/news_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/News"
                android:textColor="@color/color_0"
                android:textSize="12sp" />
            <TextView
                android:id="@+id/profile_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/Profile"
                android:textColor="@color/color_0"
                android:textSize="12sp" />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

Но как правильно написать код чтобы всё это работало я не совсем понимаю. Помогите правильно написать код. Возможно есть как-то пример.

Также я написал код в котором использовал ViewPager вместо FragmentContainerView но в таком случае выдает ошибку.

HomeActivity3.java

public class HomeActivity3 extends AppCompatActivity implements View.OnClickListener{
    private List<Fragment> list;
    private ViewPager myViewPager;
    private FraPagerAdapter adapter;
    private TextView AttractionTXT;
    private TextView RinkTXT;
    private TextView NewsTXT;
    private TextView ProfileTXT;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home3);
        initView();
        AttractionTXT = findViewById(R.id.attraction_text);
        AttractionTXT.setOnClickListener(this);
        RinkTXT = findViewById(R.id.rink_text);
        RinkTXT.setOnClickListener(this);
        NewsTXT = findViewById(R.id.news_text);
        NewsTXT.setOnClickListener(this);
        ProfileTXT = findViewById(R.id.profile_text);
        ProfileTXT.setOnClickListener(this);
    }
    @SuppressLint("ClickableViewAccessibility")
    private void initView() {
        AttractionTXT = findViewById(R.id.attraction_text);
        AttractionTXT.setOnClickListener(this);
        RinkTXT = findViewById(R.id.rink_text);
        RinkTXT.setOnClickListener(this);
        NewsTXT = findViewById(R.id.news_text);
        NewsTXT.setOnClickListener(this);
        ProfileTXT = findViewById(R.id.profile_text);
        ProfileTXT.setOnClickListener(this);
        myViewPager = findViewById(R.id.content);
        myViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {
            }
            @Override
            public void onPageSelected(int position) {
                switch (position) {
                    case 0:
                        AttractionTXT.setTextColor(Color.RED);
                        RinkTXT.setTextColor(Color.BLACK);
                        NewsTXT.setTextColor(Color.BLACK);
                        ProfileTXT.setTextColor(Color.BLACK);
                        break;
                    case 1:
                        AttractionTXT.setTextColor(Color.BLACK);
                        RinkTXT.setTextColor(Color.RED);
                        NewsTXT.setTextColor(Color.BLACK);
                        ProfileTXT.setTextColor(Color.BLACK);
                        break;
                    case 2:
                        AttractionTXT.setTextColor(Color.BLACK);
                        RinkTXT.setTextColor(Color.BLACK);
                        NewsTXT.setTextColor(Color.RED);
                        ProfileTXT.setTextColor(Color.BLACK);
                        break;
                    case 3:
                        AttractionTXT.setTextColor(Color.BLACK);
                        RinkTXT.setTextColor(Color.BLACK);
                        NewsTXT.setTextColor(Color.BLACK);
                        ProfileTXT.setTextColor(Color.RED);
                        break;
                }
            }
            @Override
            public void onPageScrollStateChanged(int SCROLL_STATE_SETTLING)
            {
            }
        });
        list = new ArrayList<>();
        list.add(new FragmentAttraction());
        list.add(new FragmentRink());
        list.add(new FragmentNews());
        list.add(new FragmentProfile());
        adapter = new FraPagerAdapter(getSupportFragmentManager(),
                FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT, list);
        myViewPager.setAdapter(adapter);
        myViewPager.setCurrentItem(0);
        myViewPager.setOnTouchListener(null);
        myViewPager.setOnTouchListener((arg0, arg1) -> true);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.attraction_text:
                myViewPager.setCurrentItem(0);
                break;
            case R.id.rink_text:
                myViewPager.setCurrentItem(1);
                break;
            case R.id.news_text:
                myViewPager.setCurrentItem(2);
                break;
            case R.id.profile_text:
                myViewPager.setCurrentItem(3);
        }
    }
}

activity_home3.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <View
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:background="@color/color_1" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/view"
        android:orientation="vertical">
        <androidx.viewpager.widget.ViewPager
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:layout_gravity="bottom"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/attraction_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:gravity="center"
                android:text="@string/Attraction"
                android:textColor="@android:color/holo_red_dark"
                android:textSize="12sp" />
            <TextView
                android:id="@+id/rink_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:gravity="center"
                android:textColor="@color/color_0"
                android:text="@string/Rink"
                android:textSize="12sp" />
            <TextView
                android:id="@+id/news_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:textColor="@color/color_0"
                android:gravity="center"
                android:text="@string/News"
                android:textSize="12sp" />
            <TextView
                android:id="@+id/profile_text"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_weight="1"
                android:textColor="@color/color_0"
                android:gravity="center"
                android:text="@string/Profile"
                android:textSize="12sp" />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

Ошибка

 java.lang.IllegalStateException: View androidx.coordinatorlayout.widget.CoordinatorLayout{fe08792 V.E...... ........ 0,0-1080,1710} does not have a NavController set
        at androidx.navigation.Navigation.findNavController(Navigation.java:84)
        at com.example.test.Attraction.FragmentAttraction.lambda$onViewCreated$0(FragmentAttraction.java:41)
        at com.example.test.Attraction.-$$Lambda$FragmentAttraction$004jlQ19iU0hh9boehMD8kBcdfE.onClick(lambda)

Если решить эту ошибку то можно и ViewPager использовать. Подскажите как её решить.

Answer 1

Ну сделайте что-то вроде этого. Определите метод в вашей активити, отвечающий за смену фрагментов внутри FragmentView. Вроде такого:

public void openFragment(Fragment fragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
    transaction.replace(R.id.fragment_container, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

После добавьте обработчики нажатий на ваши TextVeiw:

textView1.setOnClickListener(view -> {
        openFragment(new YourFragment());
    });

textView2.setOnClickListener(view -> {
        openFragment(new YourFragmentOther());
    });
READ ALSO
spring data rest: можно ли отменить операцию по условию?

spring data rest: можно ли отменить операцию по условию?

У меня есть entity с подключенным spring-boot-starter-data-rest

213
Заполнение массива рандомными числами без повтора

Заполнение массива рандомными числами без повтора

Компьютер генерирует пять чисел в диапазоне от 1 до 15 включительно

185
Создание aws role ,s3 buckets и lambda function кодом на джаве

Создание aws role ,s3 buckets и lambda function кодом на джаве

Я новичок в AWS у меня есть программа, которая делает некие операции над видео (конвертирует один формат в другой (есть два бакита в первый загружается...

261