簡體   English   中英

如何在導航抽屜的片段中添加片段

[英]How to add a fragment inside of a navigation drawer's fragment

我在導航抽屜的一個片段內使用帶有 Cardview 的 RecyclerView,我想在我的 OnClickListener 上啟動一個新片段(並通過它傳遞數據)。 我如何進行交易? 我是否必須更改導航控制器並自己進行交易? 謝謝

導航抽屜活動

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********
            }
        });
    }
}

如果您使用的是導航架構組件,則無需執行 FragmentTransactions。 相反,您應該按照導航到目標文檔並調用navigate() ,根據目標文檔之間的傳遞數據傳入 arguments 。

@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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM