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.
Спасибо, я исправил ошибку в моем вопросе. – Lukas
О, это была просто ошибка в вашем вопросе? вы также исправили код в своем приложении? ;) –
В моем приложении код был прав относительно этой ошибки. Я забыл упомянуть, что добавляю фрагмент btDiscoveryFragment во время действия onCreate(), который работает отлично. Я обновил свой вопрос. – Lukas