gpt4 book ai didi

java - 将值从适配器传递到导航组件中的底部导航 View fragment

转载 作者:行者123 更新时间:2023-12-04 07:48:37 25 4
gpt4 key购买 nike

该应用程序有一个 BottomNavigationViewMainActivity它处理 fragment 之间的导航。其中一个 fragment 具有 RecyclerView在其中和 RecyclerView 的项目有一个按钮。
我正在尝试制作 RecyclerView项目的按钮导航到另一个 fragment 并随之传递一个值,但我在传递数据时不断收到一个空对象引用。

  • 我创建了一个界面来点击 MainActivity用于 Fragment 开关并创建一个 Bundle 将接收到的值传达给所需的 Fragment
  • // The interface
    public interface OnItemClickListener {

    void onItemClick();

    适配器类
    //Define interface
    OnItemClickListener listener;

    //Create constructor for interface
    public LocationsAdapter(Activity activity) {
    listener = (MainActivity)activity;

    ...
    @Override
    public void onBindViewHolder(@NonNull LocationsViewHolder holder, int position) {

    //A click listener for the button
    holder.showMarkerButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //Create instance of MapFragment to pass data as Bundle
    MapFragment mapFragment = new MapFragment();
    LatLng latLng = new LatLng(markerObject.getLatitude(),markerObject.getLongitude());
    //Create Bundle and add data
    Bundle bundle = new Bundle();
    bundle.putString("latitude",markerObject.getLatitude().toString());
    bundle.putString("longitude",markerObject.getLongitude().toString());
    listener.onItemClick(bundle);
    }
    });
    }
  • 然后在MainActivity中我实现了切换BottomNavigation的View的界面。
  • public class MainActivity extends AppCompatActivity implements OnItemClickListener {
    BottomNavigationView navView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    navView = findViewById(R.id.nav_view);
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
    R.id.navigation_home,R.id.navigation_map, R.id.navigation_locations, R.id.navigation_profile)
    .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
    NavigationUI.setupWithNavController(navView, navController);
    }

    @Override
    public void onItemClick() {
    navView.setSelectedItemId(R.id.navigation_map);
    }
    }
  • 作为最后一步,我调用了我在第一步中创建的 Bundle,但这就是出现空对象引用的地方。
  • //MapFragment
    private void setCam(){
    Bundle bundle = getArguments();
    if (getArguments() != null ){
    String SLatitude = bundle.getString("latitude");
    String SLongitude = bundle.getString("longitude");
    Double latitude = Double.parseDouble(SLatitude);
    Double longitude = Double.parseDouble(SLongitude);
    LatLng latLng = new LatLng(latitude,longitude);
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20));
    Toast.makeText(getActivity(), latLng.toString(), Toast.LENGTH_SHORT).show();
    }
    else{
    Toast.makeText(getActivity(), "error present", Toast.LENGTH_SHORT).show();
    }
    }
    提前致谢。

    最佳答案

    MapFragment mapFragment = new MapFragment();
    LatLng latLng = new LatLng(markerObject.getLatitude(),markerObject.getLongitude());
    //Create Bundle and add data
    Bundle bundle = new Bundle();
    bundle.putString("position",latLng.toString());
    mapFragment.setArguments(bundle);
    这里 mapFragment只是一个未在导航图中使用的已创建对象。即它是一个独立于导航的独立对象,因此它不参与导航,因为它与当前的 mapFragment 不同navGraph 中的 fragment 。
    解决方案:
    为了解决这个问题,您需要在BottomNavigationView的 fragment 之间切换时传递参数,并注册 OnNavigationItemSelectedListener是一个很好的地方:
    首先允许适配器通过监听器回调将参数发送回 Activity
    因此,修改监听器回调以接受参数
    interface OnItemClickListener listener {
    void onItemClick(Bundle args);
    }
    将其应用于适配器
    @Override
    public void onBindViewHolder(@NonNull LocationsViewHolder holder, int position) {

    //A click listener for the button
    holder.showMarkerButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    LatLng latLng = new LatLng(markerObject.getLatitude(),markerObject.getLongitude());

    //Create Bundle and add data
    Bundle bundle = new Bundle();
    bundle.putString("position",latLng.toString());

    //Interface to transport the click event to the MainActivity to switch Fragment in the BottomNavigationView
    listener.onItemClick(bundle);
    }
    });
    }
    最后,注册 OnNavigationItemSelectedListenernavView并修改回调以在 Activity 中接受 Bundle:
    public class MainActivity extends AppCompatActivity implements OnItemClickListener {
    BottomNavigationView navView;

    private Bundle mapArgs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    navView = findViewById(R.id.nav_view);
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
    R.id.navigation_home,R.id.navigation_map, R.id.navigation_locations, R.id.navigation_profile)
    .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
    NavigationUI.setupWithNavController(navView, navController);


    navView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    navController.navigate(item.getItemId(), mapArgs);
    return true;
    }
    });

    }

    @Override
    public void onItemClick(Bundle args) {
    navView.setSelectedItemId(R.id.navigation_map);
    mapArgs = args;
    }


    }

    关于java - 将值从适配器传递到导航组件中的底部导航 View fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67083340/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com