Я разрабатываю приложение для киоска, так что оно берет планшет. Одиночная деятельность с кучей разных фрагментов. Я фиксирую фрагмент в oncreate активности. Затем, когда устройство подключено к bluetooth, он загрузит новый фрагмент, удалив старый и добавив новый вместо него (вызывает функцию cancelFunc()). Проблема, с которой я столкнулась, заключается в том, что первый фрагмент все еще остается видимым после удаления. Мои журналы показывают, что они фактически удалены, и вместо них добавлен новый фрагмент, но я не вижу нового или любого другого, который будет прикреплен позже. Однако, когда я нажимаю экран, он показывает новый фрагмент. Немного странно, и мне интересно, что я делаю неправильно. Это то, что происходит только на фрагменте, прикрепленном к событию активности. Код довольно длинный, поэтому я просто покажу вам несколько важных частей. Заранее спасибо за вашу помощь.удаленный фрагмент все еще виден
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.backbone);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.add(R.id.fragmentContainer, new SystemDownFragment(), "SystemDownFragment");
ft.commit();
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// If the adapter is null, then Bluetooth is not supported
if (mBluetoothAdapter == null) {
Log.d(TAG, "adapter is null");
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
finish();
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
public void cancelFunc() {
Log.d(TAG, "cancelFunc()");
removeFrag();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.add(R.id.fragmentContainer, new StartupFragment(), "StartupFragment");
ft.commit();
getFragmentManager().executePendingTransactions();
}
private void removeFrag(){
Log.d(TAG, "removeFrag()" + getActiveFragments().size());
if(getActiveFragments().size() > 0) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
for (int i = 0; i < getActiveFragments().size(); i++) {
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
ft.remove(getActiveFragments().get(i));
}
ft.commit();
}
}
@Override
public void onAttachFragment (Fragment fragment) {
Log.d(TAG, "onAttachFragment");
fragList.add(new WeakReference(fragment));
}
public List<Fragment> getActiveFragments() {
ArrayList<Fragment> ret = new ArrayList<Fragment>();
for(WeakReference<Fragment> ref : fragList) {
Fragment f = ref.get();
if(f != null) {
if(f.isVisible()) {
ret.add(f);
}
}
}
return ret;
}
Мои регистрируемые данные показывают следующее: метод
MainActivity: onCreate()
MainActivity: onAttachFragment
MainActivity: onStart()
MainActivity: onResume()
MainActivity: Bluetooth Connected
MainActivity: cancelFunc()
MainActivity: removeFrag()1
MainActivity: onAttachFragment
являются у возможность увидеть новый фрагмент? –
Используйте ft.replace (R.id.fragmentContainer, новый StartupFragment(), «StartupFragment»); вместо ft.add(); – Pitty
Я не вижу новый фрагмент, пока не коснусь экрана. После этого становится видимым. Для каждого другого фрагмента, который я добавляю и удаляю по всему коду, это работает без проблем. Но у него есть проблемы только с этим самым первым фрагментом в действиях onCreate(). И я пытался избежать замены, потому что у меня обычно есть один или два фрагмента, прикрепленных одновременно, и мне легче просто удалить их все, когда это необходимо, и добавить новые. –