【发布时间】:2019-01-24 11:36:20
【问题描述】:
我有一个包含两个片段的活动,并希望在使用后退按钮从第二个片段返回时执行第一个片段。我在将第一个片段导航到第二个片段时使用add()。这是我的场景和代码sn-p:
第一个片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.one_fragment, container, false);
final Button button = (Button) view.findViewById(R.id.buttonChange);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
buttonClicked(v);
}
});
return view;
}
public void buttonClicked(View view) {
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_Container, new TwoFragment());
fragmentTransaction.addToBackStack("sdfsf");
fragmentTransaction.commit();
}
移动到第二个片段,这里是代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.two_fragment, container, false);
return view;
}
问题是,当我从第一个片段导航到第二个片段,然后使用后退按钮再次返回第一个片段时,第一个片段生命周期方法没有执行。如果我使用replace() 而不是使用add(),那么生命周期方法正在正确执行。我知道 add() 和 replace() 之间的区别,但我想使用 add() 并且还希望在使用返回按钮返回第一个片段时有导航回调来处理一些逻辑。
也试过下面的代码:
fragmentManager.addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
Log.e(TAG, "onBackStackChanged: ");
// Update your UI here.
}
});
但它也多次调用并产生异常。
我该如何处理?当我从第二个片段返回时,专门处理第一个片段中的一些逻辑。
【问题讨论】:
-
addOnBackStackChangedListener 应该可以正常工作,可能您设置了多个侦听器而不是一个?
-
对我来说,当我从第一个片段导航到第二个片段时,它的调用以及当我回到第一个片段时,它再次调用。大教堂,每次后台更改时都会调用它。
-
没错,只要使用getBackStackEntryAt取顶部条目名称,调用getName()即可。根据名字就可以知道当前是什么fragment。
标签: android android-fragments android-lifecycle