如何隐藏 activity 中的 android 片段,以便同时只有一个片段处于活动状态?

How to hide android fragment in activity to only have one fragment active at the time?

所以基本上,我有一个名为 (Profile Activity) 的 activity 和两个连接到它的片段(Profile view 和 profile edit fragment)。由于我对 android 工作室、java 语言和片段是全新的,所以我试图将两个片段都放入 activity,但只显示个人资料视图片段。需要隐藏编辑配置文件片段。我正在使用代码的下一部分:

getSupportFragmentManager().beginTransaction().add(R.id.profile_fragment, profileViewFragment).commit();
    getSupportFragmentManager().beginTransaction().add(R.id.profile_fragment, profileEditFragment).commit();

我已经尝试使用 "hide" 和 "show",但没有成功。我已经导入了"android.support.v4.app.FragmentManager;"谢谢。

编辑:

配置文件 activity 实施新代码后:

public class ProfileActivity extends AppCompatActivity implements ProfileViewFragment.ProfileViewListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    //ovo ispod je za proslijedivanje iz activita u fragment
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);
    ProfileViewFragment profileViewFragment = new ProfileViewFragment();
    ProfileEditFragment profileEditFragment=new ProfileEditFragment();
    profileViewFragment.setArguments(getIntent().getExtras());
    profileEditFragment.setArguments(getIntent().getExtras());


    //getSupportFragmentManager().beginTransaction().add(R.id.profile_fragment, profileEditFragment).commit();
    getSupportFragmentManager().beginTransaction().add(R.id.profile_fragment, profileViewFragment).commit();
    //getSupportFragmentManager().beginTransaction().replace(R.id.profile_fragment, profileViewFragment).commit();

    //FragmentManager fm=getSupportFragmentManager();
    //fm.beginTransaction().setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out).show(new ProfileViewFragment()).commit();
    //fm.beginTransaction().setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out).show(new ProfileEditFragment()).commit();

    //-----------------------------------
}

@Override
public void onOpenProfileEditor() {
    ProfileEditFragment profileEditFragment=new ProfileEditFragment();
    profileEditFragment.setArguments(getIntent().getExtras());

    getSupportFragmentManager().beginTransaction().replace(R.id.profile_fragment, profileEditFragment).commit();
}

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof ProfileViewFragment) {
        ProfileViewFragment profileFragment = (ProfileViewFragment) fragment;
        profileFragment.setListener(this::onOpenProfileEditor);
    }
}
}

具有新代码的个人资料视图片段:

public class ProfileViewFragment extends Fragment {
private Unbinder unbinder;
//novi kod sa stacka
private ProfileViewListener listener;
//-------------
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    FragmentProfileViewBinding viewBinding=DataBindingUtil.inflate(inflater, R.layout.fragment_profile_view, container, false);
    View view=viewBinding.getRoot();
    unbinder = ButterKnife.bind(this, view);

    UserModel user = (UserModel) getArguments().get(ModelEnum.UserModel.name());
    //viewBinding povezuje fragment i xml (proslijeduje user)
    viewBinding.setUser(user);

    //viewBinding.setUserGender(user);
    return view;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

//    @OnClick(R.id.btn_change_settings)
//    public void changeSettings(){
//getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.profile_fragment, new ProfileEditFragment()).commit();
//    }

@Override
public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
}

//ISPOD JE NOVI KOD SA STACK OVERFLOWA
public interface ProfileViewListener{
    void onProfileEditor();
}

public void setListener(ProfileViewListener listener) {
    this.listener = listener;
}


@OnClick(R.id.btn_change_settings)
public void onEdit(View view){
    if(listener!=null){
        onOpenProfileEditor();
    }
}
}

而不是

getSupportFragmentManager().beginTransaction().add(R.id.profile_fragment, profileEditFragment).commit();

一定是

getSupportFragmentManager().beginTransaction().replace(R.id.profile_fragment, profileEditFragment).commit();

这将替换您的片段,而不是添加它。

请注意,您必须第一次调用 "add",然后再使用 "replace"。

您可以在此处找到有关片段的更多信息:https://developer.android.com/training/basics/fragments/fragment-ui

编辑

对于您所概述的新问题,解决方案是"report"您activity认为事件已经发生,因此可以采取行动。这是如何做到这一点。

首先,我们需要一个接口(您可以将它添加到您的 Profile 片段中)并且 link 如果它实现了该接口,activity 我们的片段。

public class ProfileViewFragment extends Fragment {
    ...
    ...

    private ProfileViewListener  listener;

    ...
    ...

    @OnClick(R.id.btn_change_settings)
    public onEdit(View view) {
        // If there is anyone listening, report that we need to open editor
        if (listener != null) {
            listener .onOpenProfileEditor();
        }
    }

    public void setListener(ProfileViewListener listener) {
        this.listener = listener;
    }

    // The interface
    public interface ProfileViewListener {
        void onOpenProfileEditor();
    }
}

而在class中,我们需要实现接口并订阅为监听器。

public class ProfileActivity extends AppCompatActivity implements ProfileViewFragment.ProfileViewListener {

    ...
    ...

    @Override
    public void onOpenProfileEditor() {
        ProfileEditFragment profileEditFragment=new ProfileEditFragment();
        profileEditFragment.setArguments(getIntent().getExtras());

        getSupportFragmentManager()
            .beginTransaction
            .replace(R.id.profile_fragment, profileEditFragment)
            .commit();
    }

    @Override
    public void onAttachFragment(Fragment fragment) {
        if (fragment instanceof ProfileViewFragment) {
            ProfileViewFragment profileFragment = (ProfileViewFragment) fragment;
            profileFragment.setListener(this);
        }
    }
}

您可以在此处找到有关 Activity-片段通信的更多详细信息 - https://developer.android.com/training/basics/fragments/communicating