小编Tom*_*ney的帖子

从onContextItemSelected显示的DialogFragment在onPause/onResume上不存在

我有一个DialogDragment,我可以用以下两种方式之一:

1)通过点击其OnItemClickListener中的ListView项

2)通过激活ListView的上下文菜单并选择菜单项

做#1在所有生命周期事件下都能正常工作,但是如果我通过#2调用它并暂停活动(通过回家)并通过任务切换器恢复它,则不再显示对话框.片段在那里,我可以旋转设备并显示对话框.

我进行了实验,如果我把DialogFragment的显示放到Handler中,延迟时间至少为1/2秒,那就可以了.

以下代码段失败 - 它显示对话框,但暂停/恢复隐藏它:

public boolean onContextItemSelected(android.view.MenuItem item) {
    boolean consumed = false;

    switch (item.getItemId()) {
    case R.id.menu_item:
        showMyDialogFragment();
        consumed = true;
        break;
    }

    return consumed;
}
Run Code Online (Sandbox Code Playgroud)

所以下面的代码段可行.暂停/恢复再次正确显示对话框:

public boolean onContextItemSelected(android.view.MenuItem item) {
    boolean consumed = false;

    switch (item.getItemId()) {
    case R.id.menu_item:
        new Handler().postDelayed(new Runnable() {
            public void run() {
                showMyDialogFragment();
            }
        }, 300);

        consumed = true;
        break;
    }

    return consumed;
}
Run Code Online (Sandbox Code Playgroud)

用0ms或250ms延迟替换300ms秒延迟会导致它再次被破坏.这可重复100%的时间.

这显然是一个可怕的黑客,通过可能取决于设备速度的常数变得更糟.

有谁知道为什么会这样做和/或提供更好的解决方案?我在这个问题上花了好几个小时,这是我能想到的最好的.

android android-lifecycle android-fragments android-dialog

8
推荐指数
1
解决办法
1046
查看次数

如何防止多次添加片段?

将UI元素(例如按钮)轻触时,将片段添加到布局中是很常见的.如果用户非常快速地多次点击按钮,则可能会多次添加片段,从而导致各种问题.

如何防止这种情况?

android android-ui android-fragments android-button

7
推荐指数
1
解决办法
3079
查看次数

Context.obtainStyledAttributes()警告

我在这个问题上浪费了3个小时,所以我希望这会节省一些时间.

public TypedArray obtainStyledAttributes (AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)
Run Code Online (Sandbox Code Playgroud)

第二个参数attrs 必须以严格递增的顺序包含属性标识符,否则属性值将不会被解析,并且调用将无声地失败,就好像该属性不存在一样.

这不是我能看到的记录,我花了很长时间才弄清楚出了什么问题.

android android-widget android-theme

6
推荐指数
0
解决办法
459
查看次数

Android Spinner - 如何调整当前所选项目的大小?

似乎旋转器的大小适合其适配器中给出的最长项目.对于大多数情况来说,这是一种很好的行为,但在我的特定情况下这是不可取的.

这有可能关掉它吗?我的猜测是不行的,通过查看源代码中的Spinner.onMeasure(),但我想问一下.

android android-spinner

5
推荐指数
1
解决办法
2046
查看次数

什么可能导致 Android 上的 SQLite 错误代码 778

我使用 ACRA 进行错误报告,在过去 30 天内,我收到了 6 个(我有成千上万的用户)崩溃报告,类似于以下内容:

android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 778)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:931)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at android.database.sqlite.SQLiteDatabase.replaceOrThrow(SQLiteDatabase.java:1411)
 :
Run Code Online (Sandbox Code Playgroud)

这些发生在我的应用程序的各个部分。所有设备均为运行 Android 4.1.2 的三星设备。我怀疑是三星的错误,但我能做些什么来缓解这个问题吗?

android android-sqlite

5
推荐指数
1
解决办法
6182
查看次数

为什么Activity.getPackageManager()返回null

我有一个方法将Intent解析为ComponentName:

private static ComponentName resolveViewExternalIntent(Context context)
{
    Intent intent = createIntent();
    return intent.resolveActivity(context.getPackageManager());
}
Run Code Online (Sandbox Code Playgroud)

我很少得到以下ACRA崩溃报告:

java.lang.NullPointerException
    at android.content.Intent.resolveActivity(Intent.java:4518)
    at com.mypackage.myclass.resolveViewExternalIntent(SourceFile:271)
    at om.mypackage.myActivity.onResume(SourceFile:517)
Run Code Online (Sandbox Code Playgroud)

Intent类中的那一行获取NPE,因为PackageManager是null.

我很少看到这一点,但经常这足以让我写下这个问题.

有没有人知道,在什么情况下Context/Activity.getPackageManager()会返回null?就我而言,context是Activity对象本身,而不是ApplicationContext.当发生这种情况时,应用程序正在执行Activity.onResume()生命周期方法.

android android-context android-package-managers android-activity

5
推荐指数
1
解决办法
3487
查看次数