3

我有一个AppCompatActivity使用 3 个标签的FragmentTabHost. 选项卡之一使用LocationServices. 我希望获得最流畅的用户体验:

如果LocationService在 android 系统中是关闭的,并且只有当用户选择需要的选项卡时,Location我想显示AlertDialog让用户Location在系统设置中打开。

我有一个助手类应该完成所有这些工作,并且它确实在我的应用程序的其他 3 个地方工作。在这 3 个地方,它“直接”在 中Activity工作,但是在这个地方,它需要Fragment在选项卡的“内”工作。

问题是,如果我有这条线:

builder.enableAutoManage(activity, 0, this);

然后builder.build()抛出异常:IllegalStateException: Recursive entry to executePendingTransactions

知道如何实现我的目标吗?

以下是一些相关的代码片段:

public class CityPreferences extends AppCompatActivity {
    private FragmentTabHost mTabHost;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
        mTabHost.addTab(
                mTabHost.newTabSpec("available_cities")
                        .setIndicator(getString(R.string.tab_all_cities))
                , AvailableCityFragment.class, null);
        mTabHost.addTab(
                mTabHost.newTabSpec("nearby_cities")
                        .setIndicator(getString(R.string.tab_nearby_cities))
                , NearbyCityFragment.class, null);
    }
}

NearbyCityFragment我有这 1 行代码:

class NearbyCityFragment extends Fragment {
...
    LocationServiceHelper.getInstance().startOrDisplayDialog(getActivity());

(我试过了onAttach,,,onStartonResume

这是我的助手类的功能:

public class LocationServiceHelper implements
    GoogleApiClient.OnConnectionFailedListener,
    GoogleApiClient.ConnectionCallbacks {

public boolean startOrDisplayDialog(@NonNull final FragmentActivity activity) {
    final boolean servicesConnected = GooglePlayServicesHelper.checkOrDisplayDialog(activity);
    if (servicesConnected) {
        final boolean isEnabled = isLocationEnabledInSystem(activity);
        if (isEnabled) {
            if (null == mGoogleApiClient) {
                mContext = activity;
                mActivity = activity;
                final GoogleApiClient.Builder builder = new GoogleApiClient.Builder(mContext)
                        .addApi(LocationServices.API)
                        .addConnectionCallbacks(this)
                        .addOnConnectionFailedListener(this);

                // the next line seems to cause the problem:
                builder.enableAutoManage(activity, 0, this);

                mGoogleApiClient = builder
                        .build();
            }
            return start();
        } else {
            final Dialog dialog = getLocationDisabledDialog(activity);
            GooglePlayServicesHelper.showDialog(dialog, activity);
        }
    }
    return false;
}

最后是例外:

06-10 10:23:04.831  26725-26725/com.fletech.android.redalert.debug E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.fletech.android.redalert.debug, PID: 26725
    java.lang.IllegalStateException: Recursive entry to executePendingTransactions
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1473)
            at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:490)
            at com.google.android.gms.common.api.g.a(Unknown Source)
            at com.google.android.gms.common.api.GoogleApiClient$Builder.gI(Unknown Source)
            at com.google.android.gms.common.api.GoogleApiClient$Builder.build(Unknown Source)
            at com.fletech.android.redalert.helper.LocationServiceHelper.startOrDisplayDialog(LocationServiceHelper.java:113)
            at com.fletech.android.redalert.city.NearbyCityFragment.onAttach(NearbyCityFragment.java:44)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:907)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
4

1 回答 1

3

clientId我相信每次启用自动管理器时都必须使用唯一的。从文档中:

clientId- 此客户端的非负标识符。在任何给定时间,每个 ID 只允许一个自动管理的客户端。要重用 id,您必须首先调用stopAutoManage(FragmentActivity)前一个客户端。

于 2015-06-19T01:32:01.127 回答