Android 如果静态创建片段,如何等待绑定服务

Android 如果静态创建片段,如何等待绑定服务,android,service,bind,fragment,Android,Service,Bind,Fragment,我有一个问题。我在活动布局中静态定义了一个片段: <?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=

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

<?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>
然而,在片段的onCreateView中,我有依赖于活动中获得的服务的代码,问题是在实际接收服务之前调用了片段的onCreateView。如何克服这个恼人的问题

提前谢谢。 加多

已解决: 多亏了@Karakuri advice,我没有在TabFragmentNew.onCreateView()中创建选项卡片段(其中onCreateView()中是服务相关代码),而是将其移动到单独的方法中,在onDeviceConnection(…)中调用该方法

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

编辑: 请尝试以下操作之一:

  • 将您的片段绑定到服务。您可以使用
    getActivity().bindService(…)
  • 给你的片段一个唯一的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(...);
        };
    };
    
    片段中任何依赖于活动的代码都应该至少推迟到片段的
    onActivityCreated()
    回调。在
    onCreateView()中展开(或创建)视图层次结构时,可以存储对需要更新的视图的引用。

    编辑: 请尝试以下操作之一:

  • 将您的片段绑定到服务。您可以使用
    getActivity().bindService(…)
  • 给你的片段一个唯一的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(...);
        };
    };
    

    是的,我知道,但是如果片段是在布局中静态定义的,我不控制它何时膨胀。接受:)可能对一些深夜开发人员有帮助是的,我知道,但是如果片段是在布局中静态定义的,我不控制它何时膨胀。接受:)可能对一些深夜开发人员有帮助