2016-09-06 5 views
1

В моем MainActivity есть FrameLayout (id = fragment_container), который заменяется Управлением в onCreate с FragmentA. FragmentA содержит только одну кнопку и вызывает onClick в MainActivity, чтобы заменить FrameLayout на FragmentB. FragmentB содержит RecyclerView и отображается правильно. Я звоню fragmentManager.popBackStack(), чтобы вернуть FragmentA. Теперь FragmentA показан поверх FragmentB (с которым я все еще могу взаимодействовать).Фрагмент все еще видимый после popBackStack

Почему FragmentB не удаляется после звонка popBackStack?

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

уже пробовал это, ничего не меняя. –

Смежные вопросы