0

FIXEDSupportFragmentManager заменить не работает

Я на стороне сканирования Bluetooth в отдельном потоке, который был провал. : D Исправлено это код теперь работает. Спасибо за поддержку!

ORIGINAL ВОПРОС

Я имеет проблемы с обмена динамически добавлены фрагменты (я использую библиотеку поддержки и моя минимальная версия API является 8 (Android 2.2)). В моем XML, который можно увидеть ниже, у меня есть FrameLayout, который содержит фрагмент.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context=".BluetoothConnectionManager"> 

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/frmlFragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true"/> 

    <android.support.v7.widget.Toolbar 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/tbBottom" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:minHeight="?attr/actionBarSize" 
     android:background="@color/hafnertec" 
     android:layout_alignParentBottom="true"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <TextView android:id="@+id/lblMode" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@string/lblMode" 
       android:layout_centerInParent="true"/> 
      <ImageButton android:id="@+id/btnRefresh" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:src="@drawable/ic_action_refresh" 
       android:layout_alignParentRight="true" 
       android:layout_centerHorizontal="true" 
       android:layout_centerVertical="true" 
       android:layout_alignRight="@id/lblMode" 
       android:clickable="false" 
       android:longClickable="false" 
       android:onClick="updateData"/> 
     </RelativeLayout> 

    </android.support.v7.widget.Toolbar> 

</RelativeLayout> 

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

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    ... 
    // fetch a FragmentManager used for exchanging the fragments 
    this.fmFragmentExchanger = this.getSupportFragmentManager(); 
    this.btDiscoveryFragment = new BluetoothDiscoveryFragment(); 
    this.btConnectorFragment = new BluetoothConnectorFragment(); 

    if (this.findViewById(R.id.frmlFragmentContainer) != null) 
    { 
     this.fmFragmentExchanger.beginTransaction().add(R.id.frmlFragmentContainer, this.btDiscoveryFragment).disallowAddToBackStack().commit(); 
    } 
    ... 
} 

Кроме того, я позаботился о том, что фрагменты расширить класс Fragment предоставляемые библиотекой поддержки:

import android.support.v4.app.Fragment; 
public class BluetoothDiscoveryFragment extends Fragment implements ... 
{ 
    // see: https://developer.android.com/training/basics/fragments/creating.html 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Nullable Bundle savedInstanceState) 
    { 
     return inflater.inflate(R.layout.fragment_connection_bluetooth_device, container, false); 
    } 

Вот мой код для обмена фрагментов:

this.fmFragmentExchanger.beginTransaction().replace(R.id.frmlFragmentContainer, this.btConnectorFragment).disallowAddToBackStack().commit(); 

Класс для обнаружения устройств Bluetooth использует BroadcastReceiver, который «связан» с активностью. Остановив процесс обнаружения или когда он закончил, я отменил регистрацию этого BroadcastReceiver.

Однако, не обмениваясь фрагментов ничего не происходит, и через некоторое время я получаю ошибку, вызванную SIGABRT:

12-31 15:09:51.621 9790-9795/com.hafnertec.afdbluetooth I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 
12-31 15:09:53.945 9790-9790/com.hafnertec.afdbluetooth A/libc﹕ Fatal signal 6 (SIGABRT) at 0x000001bd (code=0), thread 9790 (ec.afdbluetooth) 

Здесь вы можете увидеть файл /data/anr/traces.txt: trace file

Я запускаю тесты на Samsung Galaxy S I9000 с Android 4.4.4 (CM SNAPSHOT M12). Во время метода активности в OnCreate() Я добавить экземпляр btDiscoveryFragment, который работает отлично:

this.fmFragmentExchanger.beginTransaction().add(R.id.frmlFragmentContainer, this.btDiscoveryFragment).disallowAddToBackStack().commit(); 

Кроме того, при добавлении экземпляра btConnectorFragment с помощью .add() работает. Однако логически это приводит к тому, что btConnectorFragment накладывается поверх btDiscoveryFragment.

ответ

1

Я думаю, что у вас есть опечатка, вызывая btDiscoveryFragment утратившими:

this.fmFragmentExchanger = this.getSupportFragmentManager(); 
//add this line 
this.btDiscoveryFragment = new BluetoothDiscoveryFragment(); 
//remove this duplicated line 
//this.btConnectorFragment = new BluetoothConnectorFragment(); 
this.btConnectorFragment = new BluetoothConnectorFragment(); 
+0

Спасибо, я исправил ошибку в моем вопросе. – Lukas

+0

О, это была просто ошибка в вашем вопросе? вы также исправили код в своем приложении? ;) –

+0

В моем приложении код был прав относительно этой ошибки. Я забыл упомянуть, что добавляю фрагмент btDiscoveryFragment во время действия onCreate(), который работает отлично. Я обновил свой вопрос. – Lukas