SupportFragmentManager替换不起作用

时间:2014-12-31 14:25:34

标签: android android-fragments android-fragmentactivity android-support-library

固定

我将蓝牙扫描外包给一个单独的线程,这是一个失败。 :D修复了这个代码现在有效。感谢您的支持!

原始问题

我在交换动态添加的片段时遇到麻烦(我使用支持库,我的最小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()方法中实例化了这两个片段。此外,用于发现蓝牙设备的片段被添加到帧布局中,工作正常。

@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();

用于发现蓝牙设备的类使用与活动“连接”的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

我正在使用Android 4.4.4(CM SNAPSHOT M12)在三星Galaxy S I9000上运行测试。在activity的onCreate()方法中,我添加了btDiscoveryFragment实例,该实例工作正常:

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

此外,使用.add()添加实例btConnectorFragment也可以。但是,它逻辑上导致btConnectorFragment覆盖在btDiscoveryFragment上。

1 个答案:

答案 0 :(得分: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();