我一直在使用一个常见的"myToast",我myToast.cancel()在发布新的吐司之前使用它.对于Android v2.3及更早版本,这很有效.当需要发送新的吐司时,旧的吐司,如果仍然在 -屏幕,被取消(并立即消失)以替换为新的吐司.如果用户多次按下需要警报的键(以及其他条件),这可以避免堆叠一堆祝酒词.我的实际情况是出现一个吐司当按下错误的键时,如果未按下清除键,则会出现另一个键.
对于Android 4.0和4.1,myToast.cancel()在下一个toast之前发出一个杀死当前和下一个toast.当前的cancel()API确实表明它取消了当前和下一个toast(这似乎相当愚蠢).为什么要取消你想要的吐司?
任何关于取消的想法在Android版本中都能保持一致(以及它在v2.3及更早版本中的工作方式)?
我将尝试一些不道德的双吐司系统跟踪正在使用的吐司,但似乎这种痛苦解决了4.x中的这种不良行为,以便在旧的Android版本中获得完美和逻辑的功能.
好吧,我解决了它,但它并不像我希望的那样干净.我实施了双重吐司方法,它在两个吐司之间交替.首先,我们在以下之前定义活动的祝酒词OnCreate:
Toast toast0;
Toast toast1;
private static boolean lastToast0 = true;
Run Code Online (Sandbox Code Playgroud)
在OnCreate中:
toast0 = new Toast(getApplicationContext());
toast0.cancel();
toast1 = new Toast(getApplicationContext());
toast1.cancel();
Run Code Online (Sandbox Code Playgroud)
最后,当我需要同时显示吐司并取消之前的吐司时,我会使用类似的东西:
if (lastToast0) {
toast0.cancel();
toast1.setDuration(Toast.LENGTH_LONG);
toast1.setText("new message");
toast1.show();
lastToast0 = false;
} else {
toast1.cancel();
toast0.setDuration(Toast.LENGTH_LONG);
toast0.setText("new message");
toast0.show();
lastToast0 = true;
}
Run Code Online (Sandbox Code Playgroud)
如果您只需要取消现有的吐司(在它超时之前),请使用:
toast0.cancel();
toast1.cancel();
Run Code Online (Sandbox Code Playgroud)
在Nexus 7(4.1),Emulator 4.0以及Android 2.2,2.3的多个设备上进行了测试.
ACRA本身就遇到了一个奇怪的问题:
IllegalStateException: Cannot access ErrorReporter before ACRA#init
我有一个ACRA 4.3.0的应用程序,完美的工作.我将整个应用程序更改为库,因此我可以进行小修改.我创建了一个完全空白的新项目,而不是清单和链接到这个新库.对于尝试此操作的任何其他人,在AcraApplication.java中,您必须删除"resToastText = R.string.crash_toast_text"行并在Acra.init(this)下面添加一个新行;
ACRA.getConfig().setResToastText(R.string.crash_toast_text);
该项目构建良好,在调试中我已经确认ACRA.init(this); 在我的主程序代码之前和错误发生之前运行.在主程序中,我们设置了一些自定义数据:
ACRA.getErrorReporter().putCustomData("Orientation", "L");
它会导致崩溃(或更准确地说,ACRA本身会导致错误)并且不会生成ACRA报告.
任何想法下一步尝试或指示在哪里看?可能是ACRA与库不兼容,如果是这种情况,我可以用不同的方式将它拉出来,但有点挫败了库的目的.
解决方案:Acra.init(this);在init行之前添加以下三行,而不是添加以下行:
ACRAConfiguration config = ACRA.getNewDefaultConfig(this);
config.setResToastText(R.string.crash_toast_text);
ACRA.setConfig(config);
ACRA.init(this);
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于v4.3.0及更高版本.
我想我已经尝试了所有组合,但我无法使用alpha键盘来显示返回键.它总是一个"完成"按钮,这是没用的.在Nexus 7(4.1)上,它更糟糕,并显示一个愚蠢的笑脸按钮和完成按钮,这对我的应用程序没有任何意义.只要我有一个返回按钮,就可以有一个完成按钮.这是我尝试过的众多选项之一:
<AutoCompleteTextView
android:id="@+id/annotate_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:layout_marginLeft="60dp"
android:layout_marginRight="60dp"
android:layout_marginTop="15dp"
android:completionThreshold="1"
android:inputType="textCapSentences|textImeMultiLine"
android:imeOptions="actionDone"
android:lines="1"
android:maxLength="18"
android:textSize="30px" />
Run Code Online (Sandbox Code Playgroud)
我已尝试使用和不使用imeOpitons系列,以及各种inputType选项,包括删除它.有一些选项可以使它成为搜索按钮(没有帮助),但没有列出使其成为返回键.我也试过"lines = 2",但没有解决它.还有其他想法吗?
我很想在Manifest中使用Android:LargeHeap ="true"选项来获得额外的内存(我们在高分辨率的1980x1200显示器上处理5+ MB位图,并且很快就会期待更大的显示.
我已经完成了处理Android中用于位图的糟糕内存处理的所有常规技巧(即无法知道碎片内存中是否有足够大的洞,而不是试图祈祷它不会崩溃).我已经花了数周优化,修剪和应用其他技巧来最小化内存并防止崩溃.这是在2.x vs 3.x/4.x中可以完成哪些功能的技巧,但是将它们全部保存在一个应用程序中.无需指出"如何优化位图" - 我已经完成了这些并应用了我能做到的事情.
版本2.x不支持LargeHeap,并且我在2.x中不需要LargeHeap选项的较低分辨率屏幕使用不同的图像.(也没有内存不足问题).
当android:minSdkVersion ="8"时,它根本不允许使用Android:LargeHeap选项.
有没有办法有条件地为包含3.x的系统包含LargeHeap,并在2.x中忽略它?或者如果检测到3.x,应用程序本身是否尝试设置LargeHeap?我找不到任何办法,但也许我忽略了一些技巧.
我也意识到LargeHeap相当糟糕,但我们已经没有其他技巧了.理想情况下,只有在OnCreate程序中真正需要(和允许)时,以编程方式执行LargeHeap会很好.