AlertDialog.Builder不在Fragment中显示setUserVisibleHint(boolean)中的按钮

时间:2013-03-15 18:37:22

标签: android fragment android-alertdialog

我正在尝试使用AlertDialog显示Fragment时显示的setUserVisibleHint(boolean),告诉用户打开他们的GPS设置。我正在使用此代码:

new AlertDialog.Builder(getActivity())
.setTitle(R.string.dialogLocationDisabledTitle)
.setMessage(R.string.dialogLocationDisabledMsg)
.setCancelable(true)
.setPositiveButton(R.string.gpssettings, new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        mRecheckLocationOnResume = true;
    }
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
})
.create()
.show();

但是,当您在禁用GPS的情况下进入应用程序并转到屏幕时,两个按钮都不会显示。当您进入应用程序,关闭GPS,然后转到屏幕,它工作正常。任何人都可以建议为什么?

编辑:根据@ pax2K的建议,我提供了一个logcat片段。我在上面的代码中添加了日志语句:

03-19 16:05:40.062: D/LocateServiceFragment(11193): Starting AlertDialog build
03-19 16:05:40.062: D/LocateServiceFragment(11193): Adding positive button
03-19 16:05:40.072: D/LocateServiceFragment(11193): Adding negative button
03-19 16:05:40.072: D/LocateServiceFragment(11193): Building AlertDialog
03-19 16:05:40.072: D/LocateServiceFragment(11193): Showing AlertDialog
03-19 16:05:40.182: D/LocateServiceFragment(11193): AlertDialog shown
03-19 16:05:40.803: I/Adreno200-EGLSUB(11193): <ConfigWindowMatch:2089>: Format RGBX_8888.
03-19 16:05:40.903: I/Adreno200-EGLSUB(11193): <ConfigWindowMatch:2078>: Format RGBA_8888.
03-19 16:05:41.123: D/dalvikvm(11193): GC_FOR_ALLOC freed 1560K, 19% free 17223K/21219K, paused 48ms
03-19 16:05:41.363: D/OpenGLRenderer(11193): has fontRender patch
03-19 16:05:42.084: D/memalloc(11193): ashmem: Mapped buffer base:0x5576b000 size:737280 fd:166
03-19 16:05:45.668: D/memalloc(11193): /dev/pmem: Unmapping buffer base:0x56ff8000 size:16613376 offset:15998976
03-19 16:05:45.668: D/memalloc(11193): /dev/pmem: Unmapping buffer base:0x53882000 size:614400 offset:0
03-19 16:05:45.668: D/memalloc(11193): /dev/pmem: Unmapping buffer base:0x57fd0000 size:1966080 offset:1351680
03-19 16:05:45.958: D/memalloc(11193): /dev/pmem: Unmapping buffer base:0x5857d000 size:4239360 offset:3502080
03-19 16:05:45.958: D/memalloc(11193): /dev/pmem: Unmapping buffer base:0x55e8a000 size:1351680 offset:614400
03-19 16:05:46.178: D/OpenGLRenderer(11193): Flushing caches (mode 1)

任何一方都是来自代码完全不同部分的调试语句。我不是更聪明。

1 个答案:

答案 0 :(得分:1)

setUserVisibleHint(boolean)实际上并不是一种生命周期方法:它只是告诉您用户可以看到您的Fragment。我以为它会在onResume()之后被击中;我错了。 (顺便说一下,我之所以不首先使用onResume()的原因是我们预先加载Fragments而他们看不到它们。)

放入代码以确保已调用 onResume() setUserVisibleHint(boolean)已修复此问题。