【发布时间】:2016-09-07 04:53:20
【问题描述】:
在我的MainActivity 中有一个FrameLayout (id=fragment_container) 被onCreate 中的活动替换为FragmentA。 FragmentA 只包含一个 Button,并在 MainActivity 中调用 onClick 以将 FrameLayout 替换为 FragmentB。 FragmentB 包含一个 RecyclerView 并正确显示。我打电话给fragmentManager.popBackStack() 带回FragmentA。现在FragmentA 显示在FragmentB 之上(我仍然可以与之交互)。
为什么调用popBackStack后FragmentB没有被删除?
MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private FragmentManager fragmentManager;
@Override
public void onBackPressed() {
fragmentManager.popBackStack();
}
@Override
public void onClick(View view) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, new FragmentB());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
FragmentA fragment = FragmentA.getInstance(this); //register OnClickListener
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
}
//...
}
片段A
public class FragmentA extends Fragment {
private View.OnClickListener onClickListener;
public FragmentA() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_a, container, false);
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab);
fab.setOnClickListener(onClickListener);
return view;
}
public static FragmentA getInstance(View.OnClickListener onClickListener) {
FragmentA fragmentA = new FragmentA();
fragmentA.setOnClickListener(onClickListener);
return fragmentA;
}
private void setOnClickListener(View.OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
}
片段B
public class FragmentB extends Fragment {
//...
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.FragmentB, container, true);
//manipulating Views...
//...
return view;
}
}
【问题讨论】:
-
为片段A添加背景色
-
@JpCrow 这不是一个肮脏的解决方法吗?
-
如果您愿意,可以将其添加到活动的主题中,然后使用开发人员工具检查该片段的过度绘制