0

В настоящее время я создаю приложение, использующее соединение Bluetooth. Соединение обрабатывается внутри простого объекта (HandleConnection). Когда соединение выполняется, мое приложение переходит в «удаленный» режим, что означает, что я заменяю свой основной фрагмент другим (RemoteFragment), который использует объект «HandleConnection».Фрагмент сбрасывается после изменения конфигурации

Пока все не будет хорошо, так как в конце моего «OnCreate» (в моей деятельности) я установил атрибут handleConnection в RemoteFragment в:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_layout); 


    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
    if (savedInstanceState == null) { 
     retainedFragment = new RetainedFragment(); 
     getFragmentManager().beginTransaction().add(retainedFragment, RetainedFragment.class.toString()).commit(); 
     handleConnection = new HandleConnection(this, handler); 
     retainedFragment.setHandleConnection(handleConnection); 

    } else { 

     remoteFragment = (RemoteFragment) getFragmentManager().findFragmentByTag(RemoteFragment.class.toString()); 
     retainedFragment = (RetainedFragment) getFragmentManager().findFragmentByTag(RetainedFragment.class.toString()); 

     if (remoteFragment == null) 
      remoteFragment = new RemoteFragment(); 

     handleConnection = retainedFragment.getHandleConnection(); 
     remoteFragment.setHandleConnection(handleConnection); 
    } 

    fragmentTransaction.commit(); 

} 

Все хорошо, за исключением, когда я превращаюсь в ландшафтном режиме работает. Затем (после игры в режиме отладки) кажется, что мой RemoteFragment воссоздан после вызова моего сеттера, что, очевидно, означает, что мой атрибут handleConnection равен null. Почему это так? Я бы понял, если бы я не использовал предыдущий фрагмент (тогда у меня было бы два разных фрагмента друг на друга), но в этом случае он не имеет смысла. Я сделал обходное решение, вызвав функцию обратного вызова внутри onCreateView, чтобы получить объект HandleConnection, но почему атрибут должен быть нулевым, когда я вызывал сеттер раньше?

Спасибо!

ответ

0

Таким образом, очевидно, моя проблема в том, что я не использовал право экземпляр моего RemoteFragment, что означает, что моя текущая ссылка (в моей деятельности) имела правильное ненулевое значение для моего объекта, но фрагмент, отображаемый не был этим (это был старый, который был воссоздан и, следовательно, имел нулевое значение для handleConnection).

0

Жизненный цикл фрагмента напрямую зависит от жизненного цикла организации-хозяина. когда действие уничтожается, так же как и все фрагменты. Во время изменений макета, активность уничтожается и воссоздается.

В этом случае после поворота будет выполняться условие else в методе onCreate() и, следовательно, поведение, которое вы получаете. Взгляните на документацию для полного понимания.

http://developer.android.com/guide/components/fragments.html

+0

Да, но поскольку я вызываю '' '' remoteFragment.setHandleConnection (handleConnection); '' '' remoteFragment не должен иметь нулевой указатель при вводе onCreateView? – pLesur

+0

В вашем другом состоянии, когда вы вызываете «handleConnection = сохраненныйFragment.getHandleConnection();» этот дескриптор Connection null? Я думаю, это нулевое значение. Перед установкой этого параметра на «remoteFragment» вы должны провести проверку недействительности. – Sabeeh

+0

Нет, соединение handleConnection не равно нулю. Я использовал шаблон RetainedFragment, упомянутый в документе android doc: [link] (http://developer.android.com/guide/topics/resources/runtime-changes.html) – pLesur

0

Вы должны добавить к вашей регистрации активности в AndroidManifes.xml что-то вроде этого: <activity android:configChanges="orientation|screenSize"/>

Читать this статьи

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