2016-01-04 2 views
1

Я разрабатываю приложение для киоска, так что оно берет планшет. Одиночная деятельность с кучей разных фрагментов. Я фиксирую фрагмент в 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 
+0

являются у возможность увидеть новый фрагмент? –

+0

Используйте ft.replace (R.id.fragmentContainer, новый StartupFragment(), «StartupFragment»); вместо ft.add(); – Pitty

+0

Я не вижу новый фрагмент, пока не коснусь экрана. После этого становится видимым. Для каждого другого фрагмента, который я добавляю и удаляю по всему коду, это работает без проблем. Но у него есть проблемы только с этим самым первым фрагментом в действиях onCreate(). И я пытался избежать замены, потому что у меня обычно есть один или два фрагмента, прикрепленных одновременно, и мне легче просто удалить их все, когда это необходимо, и добавить новые. –

ответ

4

Очистить или удалить все виды из текущего фрагмента, а затем заменить новый фрагмент в Layout.

Как этот, попробуйте этот

myLayout.removeAllViews(); 

AddNewFragment new = new AddNewFragment(); 

this.getFragmentManager().beginTransaction().replace(R.id.fragment_mainLayout, new, "").addToBackStack(null).commit(); 
+0

Это может быть и так. Я попробую это сегодня вечером и вернусь к вам. Благодарю. –

+0

You r Добро пожаловать. :) Plz примите мой ответ, если он действительно поможет вам. – Bhoomika

0

Для того, чтобы удалить фрагмент нужно просто вызвать активность onBackPressed(), так как этот метод выполняет операцию идти назад, таким образом, это приведет к удалению текущий фрагмент из активности, а затем вы можете добавить еще один. Поэтому обновите метод removefrag() с помощью кода ниже.

попробовать это,

void removeFrag(){ 
    onBackPresssed(); 
} 
+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10767144) –

+0

@MuhammedRefaat: Он попросил удалить фрагмент, и я упомянул код, который делает то же самое. Что случилось с ответом? – Deepak

+0

нет ничего плохого, но есть что-то неудобное, так как здесь, в SO, все ответы без пояснений удаляются, потому что точка сообщества - это знание не только для решения проблем, поэтому любезно объясните, почему ваш код решает свою проблему, так как это будет принести ему пользу и кому-либо еще увидеть ваш ответ. –

0

Это может решить вашу проблему, но это также хорошая практика для того, что вы хотите сделать; Используйте ft.replace(...) на вашем FragmentTransaction вместо добавления и удаления ...

+0

Не могли бы вы объяснить, почему это хорошая практика? Мое приложение имеет несколько фрагментов, отображаемых одновременно, и я обнаружил, что мне было легче удалить все фрагменты и отобразить новые. –

0

Вы должны заменить новый фрагмент, когда он был нажат в этой операции.

public void onBackPressed() { 
     ft.replace(R.id.fragment_container, new_fragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.commit(); 

}

+0

Это приложение для киоска. Он полностью захватывает приложение, и мы прячем кнопки назад. поэтому я не могу полагаться onBackPressed() –

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