【发布时间】:2021-04-18 06:28:54
【问题描述】:
应用程序在MainActivity 上有一个BottomNavigationView,用于处理片段之间的导航。其中一个片段中有一个RecyclerView,RecyclerView 的项目有一个按钮。
我正在尝试让 RecyclerView Items 按钮导航到另一个 Fragment 并随之传递一个值,但我在传递数据时不断收到空对象引用。
- 我创建了一个界面来获得对 Fragment 开关的
MainActivity的点击,并创建了一个 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对象发生了什么。 -
@ShayKin 我添加了完整的 MainActivity
-
@M.Azyoksul 是的,现在我明白了问题所在,必须将 Bundle 提交到我将切换到的 Fragment 才能访问 Bundle。如何引用 BottomNavigation 正在使用的同一 MapFragment 实例?我了解通常使用 FragmentManager 提交 Bundle,例如
getFragmentManager().beginTransaction().add(R.id.container, fragment).commit();,但由于导航由 NavController 负责,因此我不能使用 FragmentManager。 -
在这种情况下为什么不使用ViewModel
标签: java android android-fragments android-recyclerview bundle