1

我有一个烦人的问题。我在活动布局中静态定义了一个片段:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >
    <fragment
        android:id="@+id/tab_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.trilobitsol.one.TabFragmentNew" >
    </fragment>
</LinearLayout>

在活动的 onCreate 我绑定到服务,在 onServiceConnected 我收到一个服务:

private ServiceConnection serviceConn = new ServiceConnection() {
        public void onServiceConnected(ComponentName name, IBinder binder) {
            service = ((AlarmService.AlarmBinder)binder).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            service = null;
        };
    };

然而,在片段的 onCreateView 中,我有依赖于 Activity 中的服务的代码,问题是片段的 onCreateView 在实际接收到服务之前被调用。如何克服这个恼人的问题?

提前致谢。哈多

已解决: 感谢@Karakuri 的建议,而不是在 TabFragmentNew.onCreateView() 中创建选项卡片段(其中 onCreateView() 是服务相关代码),我已将其移至我在 onSeviceConnected(...) 中调用的单独方法。

4

1 回答 1

4

片段中依赖于 Activity 的任何代码都应该至少推迟到onActivityCreated()片段的回调中。您可以在膨胀(或创建)视图层次结构时存储对需要更新的视图的引用onCreateView()

编辑: 尝试以下任一方法:

  1. 改为将您的片段绑定到服务。您可以使用getActivity().bindService(...)
  2. 给你的片段一个唯一的 id 或标签。当您的活动收到onServiceConnected()回调时,让它找到您的片段并在其上调用一些公共方法

片段代码:

public void serviceConnected(/*any args you want*/) {
    // ...
}
public void serviceDisonnected(/*any args you want*/) {
    // ...
}

活动代码:

private ServiceConnection serviceConn = new ServiceConnection() {
    public void onServiceConnected(ComponentName name, IBinder binder) {
        service = ((AlarmService.AlarmBinder)binder).getService();
        TabFragmentNew fragment = (TabFragmentNew) getFragmentManager().findFragmentById(R.id.tab_fragment);
        if (fragment != null) fragment.serviceConnected(...);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        service = null;
        TabFragmentNew fragment = (TabFragmentNew) getFragmentManager().findFragmentById(R.id.tab_fragment);
        if (fragment != null) fragment.serviceDisconnected(...);
    };
};
于 2013-06-05T20:34:02.853 回答