我有一个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%的时间.
这显然是一个可怕的黑客,通过可能取决于设备速度的常数变得更糟.
有谁知道为什么会这样做和/或提供更好的解决方案?我在这个问题上花了好几个小时,这是我能想到的最好的.
将UI元素(例如按钮)轻触时,将片段添加到布局中是很常见的.如果用户非常快速地多次点击按钮,则可能会多次添加片段,从而导致各种问题.
如何防止这种情况?
我在这个问题上浪费了3个小时,所以我希望这会节省一些时间.
public TypedArray obtainStyledAttributes (AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes)
Run Code Online (Sandbox Code Playgroud)
第二个参数attrs
必须以严格递增的顺序包含属性标识符,否则属性值将不会被解析,并且调用将无声地失败,就好像该属性不存在一样.
这不是我能看到的记录,我花了很长时间才弄清楚出了什么问题.
似乎旋转器的大小适合其适配器中给出的最长项目.对于大多数情况来说,这是一种很好的行为,但在我的特定情况下这是不可取的.
这有可能关掉它吗?我的猜测是不行的,通过查看源代码中的Spinner.onMeasure(),但我想问一下.
我使用 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 的三星设备。我怀疑是三星的错误,但我能做些什么来缓解这个问题吗?
我有一个方法将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