Androidx:使用一个片段中的按钮导航到另一个片段

时间:2020-08-21 07:50:55

标签: java android android-layout android-fragments

我是android开发的新手,正在开发我的第一个应用程序,遇到了我所理解的一个非常简单的并发症,但是我似乎无法解决它,而且我获得的大多数在线资源跨已过时,并包括不推荐使用的方法。话虽如此,但问题所在:

在MainActivity.java中,我正在使用侧面抽屉导航,该导航使我可以在片段之间移动。这是代码:

@Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch(item.getItemId()) {
            case R.id.nav_home:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,new HomeFragment()).commit();
                break;
            case R.id.nav_account:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AccountFragment()).commit();
                break;
            case R.id.nav_goals:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new GoalsFragment()).commit();
                break;
            case R.id.nav_progress:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProgressFragment()).commit();
                break;
            case R.id.nav_food_diary:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new FoodDiaryFragment()).commit();
                break;
            case R.id.nav_nutrition:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NutritionFragment()).commit();
                break;
            case R.id.nav_settings:
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit();
                break;
        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    } 

所有这些片段之间的导航非常完美。但是我的问题是,这些片段中的一个片段上存在一个按钮,我想用它带我到另一个片段,该片段无法通过导航抽屉访问。让我们称之为fragment_profile。 可以通过单击按钮从现有片段导航到此新片段。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

补充维卡斯所说的话。 他告诉我们,当您需要从“活动”转到“片段”时,您需要像下面的getSupportFragmentManager()

@Override
public void onClick(View view){
   getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit();
}

请注意,在这里我们需要如何为ProfileFragment()传递类,其布局fragment_profile将被自动加载,因为您将ProfileFragment()设置为fragment_profile

接下来,您将来可能希望从一个Fragment转到另一个getActivity(),在这种情况下,您只需在getFragmentManager()之前添加@Override public void onClick(View view){ getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); } ,这样它将变成

$this->validate($request, [
  'user_photo' => 'sometimes|required|mimes:jpeg,jpg,png,gif,svg|max:5000',
]);

if($request->hasFile('user_photo')){
  $photo_file = $request->file('user_photo');
  $photo_filename = 'dp_' . $user_id . '.' . $photo_file->getClientOriginalExtension();
  $photo_path = $request->file('user_photo')->move(public_path('DP/'), $photo_filename);//Your image save in public/DP folder
  $userModel->display_image_path = $photo_path;
}

答案 1 :(得分:1)

要将片段放在屏幕上,您只需要一个fragmentmananger。正如您在代码中看到的那样,当单击导航中的一个选项然后致电时,您的更改方式

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit();

将现有片段替换为所选片段。用户单击如下按钮时完全相同。

//your click listener callback
@Override
public void onClick(View view){
   getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit();
}

您唯一需要注意的是主机应该具有片段容器fragment_container