【问题标题】:How to add a fragment inside of a navigation drawer's fragment如何在导航抽屉的片段中添加片段
【发布时间】:2020-07-21 02:37:31
【问题描述】:

我在导航抽屉的一个片段内使用带有 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********
            }
        });
    }
}

【问题讨论】:

    标签: android android-fragments transactions navigation-drawer


    【解决方案1】:

    如果您使用的是导航架构组件,则无需执行 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2018-01-16
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多