java - 从打开的子 Activity 转到现有 fragment

标签 java android google-maps android-fragments parameter-passing

我有一个应用程序,有两个带有 fragment 的选项卡。一个选项卡称为 map ,另一个选项卡称为restaurantList。当我点击 map 标记或列表中的卡片时,它会打开一个 restaurantDetailsActivity,其中包含有关餐厅的信息 - latlang、名称、评级等。我有一个 float 操作按钮,用户应该单击该按钮,它应该关闭当前 Activity 并转到 map 选项卡 fragment ,转到我从 Activity 传递的位置。我尝试了很多东西但没有成功:1 2 3 4 5 6 7 8 9 ...

这就是我想要的 - 当用户单击 FAB 时,它应该将 latlon 从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/

相关文章:

java - 对象数组可以被视为Java中的对象集合吗?

java - 在 JavaFX 中同时启用/禁用组按钮

android - 如何创建带圆角的条纹按钮

android - 如何将我当前位置的 map 绘制到特定的纬度经度值

Javascript 无法访问函数外的全局变量

java - 如何使用java在文本文件中查找和分隔字符串值?

java - Java 中可以将一个方法传递给另一个方法吗

android - 工具栏标题不显示

java - 如何使用 playTogether 顺序播放 ObjectAnimator

angular - 如何在 Angular 4 中实现 Google Maps API (initMap)?