2016-09-06 87 views
1

在我的MainActivity中有一个FrameLayout(id = fragment_container),它被onCreate中的活动替换为FragmentAFragmentA只包含一个按钮并在MainActivity中调用onClick以便用FragmentB替换FrameLayoutFragmentB包含一个RecyclerView并显示正确。我打电话fragmentManager.popBackStack()带回FragmentA。现在FragmentA显示在FragmentB之上(我仍然可以与之交互)。popBackStack后仍然可见片段

为什么在拨打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(); 
    } 
//... 
} 

FragmentA

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; 
    } 
} 

FragmentB

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; 
    } 
} 
+0

为片段A添加背景颜色。 – JpCrow

+0

@JPCrow会不会是一个肮脏的解决方法? –

+0

如果您愿意,您可以将其添加到您的活动主题中,然后使用开发人员工具检查该片段的透支 – JpCrow

回答

0

的问题是在FragmentB类。你不应该通过参数attachToRoot=true

试试这个:

public class FragmentB extends Fragment { 

    //... 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     //don't pass true 
     View view = inflater.inflate(R.layout.FragmentB, container, false); 
     //manipulating Views... 
     //... 

     return view; 
    } 
} 
0

使用popBackStackImmediate代替,

@Override 
public void onBackPressed() { 
    fragmentManager.popBackStackImmediate(); 
} 

popBackStackImmediate docs

像popBackStack(),但立即执行调用内部的操作。这就像之后调用executePendingTransactions()。

+0

已经尝试过,没有任何更改。 –