Заменить фрагменты по умолчанию Android Studio навигационный ящик - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь заменить домашний фрагмент фрагментом галереи и наоборот в стандартном блоке навигации из Android Studio. Это основной класс:

package com.example.navdrawer;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import android.view.View;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.google.android.material.navigation.NavigationView;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.Menu;

public class MainActivity extends AppCompatActivity {

    private AppBarConfiguration mAppBarConfiguration;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
                R.id.nav_tools, R.id.nav_share, R.id.nav_send)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }
}

Это домашний фрагмент:

import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.example.navdrawer.R;
import com.example.navdrawer.ui.gallery.GalleryFragment;

public class HomeFragment extends Fragment {
    Button button;
    TextView textView = null;
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.fragment_home, container, false);
        textView = root.findViewById(R.id.text_home);
        textView.setText("This is home fragment");
        button = root.findViewById(R.id.home_button);
        return root;
    }
    public void onClick(View v) {
//respond to clicks
        if (v.getId() == R.id.home_button) {
            GalleryFragment frag = new GalleryFragment();
            FragmentManager ft = getFragmentManager();
            FragmentTransaction fragmentTransaction =ft.beginTransaction();
            fragmentTransaction.replace(R.id.home, frag);
            // ft.addToBackStack(null);
            fragmentTransaction.commit();
        }

        }

}

Фрагмент галереи совпадает с домашним фрагментом:

 package com.example.navdrawer.ui.gallery;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;

import com.example.navdrawer.R;
import com.example.navdrawer.ui.home.HomeFragment;

public class GalleryFragment extends Fragment {
    Button button;
    TextView textView = null;
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.fragment_gallery, container, false);
        textView = root.findViewById(R.id.text_gallery);
        textView.setText("This is gallery fragment");
        button = root.findViewById(R.id.gallery_button);
        return root;
    }

    public void onClick(View v) {
//respond to clicks
        if (v.getId() == R.id.gallery_button) {
            HomeFragment frag = new HomeFragment();
            FragmentManager ft = getFragmentManager();
            FragmentTransaction fragmentTransaction =ft.beginTransaction();
            fragmentTransaction.replace(R.id.gallery, frag);
            // ft.addToBackStack(null);
            fragmentTransaction.commit();
        }

    }

}

И у меня есть xml для домашнего фрагмента, который похож на xml из фрагмента галереи:

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scrollView2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <RelativeLayout
        android:id="@+id/home"
        android:screenOrientation="portrait"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/text_home"
                android:layout_marginTop="50dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

        <Button
            android:id="@+id/home_button"
            android:layout_centerHorizontal="true"
            android:layout_below="@+id/text_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/replace1" />


    </RelativeLayout>
</ScrollView>

Я не знаю, почему он не работает.

Ответы [ 2 ]

1 голос
/ 31 января 2020

Я нашел ответ из этого поста: ссылка Для навигации между фрагментами все, что мне нужно было сделать, это реализовать этот метод в функции "onCreateView":

button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.nav_gallery, null));

Другой метод:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Navigation.findNavController(view).navigate(R.id.nav_gallery);
            }
        });

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

0 голосов
/ 31 января 2020

В шаблоне по умолчанию используется Компонент навигации , что означает, что вы не выполняете FragmentTransactions вручную. Вместо этого, согласно документации , вы добавите GalleryFragment к файлу навигации XML (под res/navigation), а затем вызовете navigate() на go к этому месту назначения, заменив экран Вы в данный момент.

...