我有一个应用程序,有两个带有 fragment 的选项卡。一个选项卡称为 map ,另一个选项卡称为restaurantList。当我点击 map 标记或列表中的卡片时,它会打开一个 restaurantDetailsActivity,其中包含有关餐厅的信息 - lat
、lang
、名称、评级等。我有一个 float 操作按钮,用户应该单击该按钮,它应该关闭当前 Activity 并转到 map 选项卡 fragment ,转到我从 Activity 传递的位置。我尝试了很多东西但没有成功:1 2 3 4 5 6 7 8 9 ...
这就是我想要的 - 当用户单击 FAB 时,它应该将 lat
和 lon
从restaurantDetailsActivity传递到我的 map fragment 并放大到该位置(基于纬度和经度),无论它是从列表 fragment 还是 map fragment 打开。
我的餐厅详情 Activity :
final String lat = restaurant.getLat();
final String lon = restaurant.getLon();
FloatingActionButton fabGoToMap = findViewById(R.id.fabGoToMap);
fabGoToMap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// MapsFragment fragment = new MapsFragment();
// Bundle bundle = new Bundle();
// bundle.putString("lat", lat);
// bundle.putString("lon", lon);
// MapsFragment mapsFragment = new MapsFragment();
// mapsFragment.setArguments(bundle);
// Intent restaurantDescriptionIntent = new Intent(this, MapsFragment.class);
Bundle bundle = new Bundle();
bundle.putString("lat", lat);
bundle.putString("lon", lon);
MapsFragment fragInfo = new MapsFragment();
fragInfo.setArguments(bundle);
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// transaction.add(R.id.map, mapsFragment, "tag").commit();
finish();
}
});
更新的代码: 从列表 fragment 调用 Activity :
public void fetchRestaurant(String restaurantId) {
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<RestaurantResponse> call = apiService.getRestaurantById(restaurantId);
call.enqueue(new Callback<RestaurantResponse>() {
@Override
public void onResponse(Call<RestaurantResponse> call, retrofit2.Response<RestaurantResponse> response) {
final Restaurant restaurant= response.body().getResults();
Intent intent = new Intent(getActivity().getApplicationContext(), AvailableRestaurantActivity.class);
intent.putExtra("estaurant", estaurant);
startActivity(intent);
}
@Override
public void onFailure(Call<RestaurantResponse> call, Throwable t) {
// Log error here since request failed
Log.e(TAG, t.toString());
Toast.makeText(getActivity().getApplicationContext(), R.string.failed_connectivity, Toast.LENGTH_LONG).show();
}
});
}
我的主要 Activity :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
tutorialUsed = false;
tutorialPage = 1;
db = new SQLiteHandler(getApplicationContext());
// session manager
session = new SessionManager(getApplicationContext());
if (!session.isLoggedIn()) {
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
} else {
List<restaurant> restaurants = new ArrayList<>();
TabLayout tabLayout = findViewById(R.id.sliding_tabs);
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two)));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);
final ViewPager viewPager = findViewById(R.id.viewpager);
PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setOffscreenPageLimit(3);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
});
....
myUserName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent accountIntent = new Intent(MainActivity.this, MyProfileActivity.class);
startActivity(accountIntent);
}
});
}
}
最佳答案
像这样使用startActivityForResult从MainActivity启动restaurantDetailactivity
startActivityForResult(intent, SHOW_DETAILS_REQUEST);
点击FAB应该是这样的
final String lat = restaurant.getLat();
final String lon = restaurant.getLon();
FloatingActionButton fabGoToMap = findViewById(R.id.fabGoToMap);
fabGoToMap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("lat", lat);
bundle.putString("lon", lon);
intent.putExtras(bundle);
setResult(Activity.RESULT_OK,intent);
}
});
在您的 MainActivity 中处理 Activity 结果,如下所示
@Override
protected void onActivityResult(final int requestCode,
final int resultCode,
final Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case SHOW_DETAILS_REQUEST: {
//select mapfragment as current, assuming it is at index 0
viewpager.setCurrentItem(0);
//add your zoom logic here in zoomToCenter method
mapfragment.zoomToCenter(data.getStringExtra("lat"),data.getStringExtra("lon"));
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
关于java - 从打开的子 Activity 转到现有 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47889951/