如何在导航抽屉的片段中添加片段

时间:2020-07-21 02:37:31

标签: android android-fragments transactions navigation-drawer

我在导航抽屉的一个片段中使用了带有Cardview的RecyclerView,我想在OnClickListener上启动一个新片段(并通过它传递数据)。 我该如何进行交易? 我是否需要更改navController并自己完成交易? 谢谢你

导航抽屉活动

package com.bookswap;

import android.os.Bundle;
import android.view.View;
import android.view.Menu;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;

import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class DrawerActivity 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);

        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_libros)
                .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) {
    //    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();
    }
}

导航抽屉的片段:

package com.bookswap.ui.libros;

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.bookswap.R;
import com.bookswap.entidades.Libro;
import com.bookswap.ui.libros.adaptadores.LibrosAdapter;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class LibrosFragment extends Fragment {

    private LibrosAdapter librosAdapter;
    RecyclerView recyclerView;
    ArrayList<Libro> libros;

    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_libros, container, false);
        recyclerView = view.findViewById(R.id.recyclerview);

        libros = new ArrayList<>();

        // Cargar la lista
        cargarLista();
        // Mostrar data
        mostrarData();

        return view;
    }

    private void cargarLista() {
        Libro libro = new Libro();

        libro.setImagenId(R.drawable.libro_pic);
        libro.setTitulo("El Camino de los Reyes");
        libro.setAutor("Brandon Sanderson");
        libro.setGenero("Fantasia");
        libro.setAño("2010");
        libro.setEditorial("Editorial Nova");

        libros.add(libro);
    }

    private void mostrarData() {
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        librosAdapter = new LibrosAdapter(getContext(), libros);
        recyclerView.setAdapter(librosAdapter);

        librosAdapter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                *********FRAGMENT TRANSACTION HERE********
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

如果您正在使用导航体系结构组件,则不要执行FragmentTransactions。相反,您应该遵循navigate to a destination documentation并调用navigate(),并按照pass data between destinations documentation传递参数。

@Override
public void onClick(View view) {
    NavController navController = Navigation.findNavController(view);
    Bundle arguments = new Bundle();
    arguments.putString("key", "value");
    navController.navigate(R.id.your_destination_from_the_nav_graph, arguments);
}