我正试图覆盖后退按键的功能.当用户按下一次时,我希望它返回到前一个屏幕.但是,当长按后退键时(例如,两秒钟或更长时间),我想退出应用程序.
到目前为止,我已经在我的活动中覆盖了这两个方法:
@Override
public boolean onKeyDown( int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK) {
//manage short keypress
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyLongPress( int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK) {
//manage long keypress (different code than short one)
return true;
}
return super.onKeyLongPress(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)
但是onKeyLongPress从不调用回调,因为该onKeyDown方法始终接收该事件.
有两种方法有效吗?或者让它全部完成onKeyDown并使用重复次数/毫秒来检测它?
我目前正在对图书馆进行单元测试.在某些类中,我需要在一些静态方法中将活动作为参数传递.图书馆本身不包含任何活动.我需要以某种方式获取模拟活动的实例,以便在每个单独的方法测试中使用.
我已经阅读了Activity Testing Tutorial和Testing Fundamentals部分.如果你要测试已经存在于待测试项目中的活动,那么它的大部分内容才有意义.但我只需要一个模拟的东西,比如在Ui线程中显示对话框和运行短任务.
实现这一目标的最快,最简单的方法是什么?我应该在我的测试项目中创建模拟活动,还为虚拟UI提供xml布局资源?
更新
由于我没有找到任何自动创建模拟活动的方法,我决定自己提供.我在测试项目中创建了一个虚拟活动,什么都不做,并通过xml提供了一个虚拟布局.然后我编写了我的测试扩展ActivityInstrumentationTestCase2:
public class LibraryTest extends ActivityInstrumentationTestCase2<MockActivity> {
public LibraryTest(String name) {
super(MockActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
}
public void testAMethodFromLibrary() {
fail("Not yet implemented");
}
}
Run Code Online (Sandbox Code Playgroud)
MockActivity我在此测试项目中创建的上述模拟活动在哪里.但是,似乎Android测试框架在启动活动时遇到问题,并且它出现了这个异常:
java.lang.RuntimeException: Exception during suite construction
at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:239)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
Caused by: java.lang.NullPointerException: Method name must not be null.
at java.lang.ClassCache.findMethodByName(ClassCache.java:297)
at java.lang.Class.getMethod(Class.java:985)
at android.test.suitebuilder.TestMethod.getAnnotation(TestMethod.java:60)
at android.test.suitebuilder.annotation.HasMethodAnnotation.apply(HasMethodAnnotation.java:39) …Run Code Online (Sandbox Code Playgroud) 我正在玩这个XmlHttpRequest东西.在一些教程和书籍中,它是onload在请求完成时调用的函数.在我的小实验中,永远不会调用此函数.这是我的代码:
window.onload = function() {
var url = "http://www.google.com";
var request = new XMLHttpRequest();
request.onload = function() {
var state = this.readyState;
var responseCode = request.status;
console.log("request.onload called. readyState: " + state + "; status: " + responseCode);
if (state == this.DONE && responseCode == 200) {
var responseData = this.responseText;
alert("Success: " + responseData.length + " chars received.");
}
};
request.error = function(e) {
console.log("request.error called. Error: " + e);
};
request.onreadystatechange = function(){
console.log("request.onreadystatechange …Run Code Online (Sandbox Code Playgroud) 我想在单元测试中测试是否使用AlarmManager被编程的警报被触发,如果是,则在正确的时间内触发.
这是要测试的接收器类.我在我的测试项目中创建了它.(注意:它没有在清单中注册)
public class MockBroadcastReceiver extends BroadcastReceiver {
private static int numTimesCalled = 0;
MockBroadcastReceiver(){
numTimesCalled = 0;
}
@Override
public void onReceive(Context context, Intent intent) {
numTimesCalled++;
}
public static int getNumTimesCalled() {
return numTimesCalled;
}
public static void setNumTimesCalled(int numTimesCalled) {
MockBroadcastReceiver.numTimesCalled = numTimesCalled;
}
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试.该programReceiver方法实际上属于主项目中的一个类,但我已将其包含在测试中,因此您无需读取如此多的代码.
public class ATest extends AndroidTestCase {
MockBroadcastReceiver mockReceiver;
@Override
protected void setUp() throws Exception {
mockReceiver = new MockBroadcastReceiver();
getContext().registerReceiver(mockReceiver, new IntentFilter());
}
@Override
protected void tearDown() …Run Code Online (Sandbox Code Playgroud) 我使用的是Android Studio 2.1,它基于IntelliJ IDEA 2016.
如果你选择VCS -> Commit changes了一个很好的对话框,显示所有修改过的文件,你就可以选择要提交的内容.
但是在选择时VCS -> Update project没有对话框.你必须更新所有给予或采取的一切.
我真的很想念eclipse的Team Syncronize视角.与此相比,无论是提交还是更新,它都是屁股.
有没有办法显示一个对话框来选择要更新的文件?或者也许是一些插件?我厌倦了从其他团队成员导入工作空间元数据,甚至在进行批量更新时破坏了构建.唯一的解决方法似乎是首先查看传入的选项卡,然后右键单击所需的文件,这不是非常有效,因为您必须首先扩展其包或父文件夹,并且您可能还需要手动刷新传入标签.
我将尝试用一个简短的例子来描述这个问题。
假设我们有一个代表自定义开关的子可组合项,并且希望保持它不可变,因此我们需要传递初始状态和 lambda,以便在用户切换开关时更改其真实来源:
@Composable
fun CustomSwitch(
title: String? = null,
checked: Boolean = false,
onSwitchChanged: ((Boolean) -> Unit)? = null
){
//...
}
Run Code Online (Sandbox Code Playgroud)
现在我们有了一个父可组合项,代表屏幕上有许多开关的部分。如果我们也想保持它不可变,我们需要通过参数向上公开子级的所有属性:
@Composable
fun PreferencesCard(
switch1Title: String? = null,
switch1Checked: Boolean = false,
OnSwitch1Changed: ((Boolean) -> Unit)? = null,
switch2Title: String? = null,
switch2Checked: Boolean = false,
OnSwitch2Changed: ((Boolean) -> Unit)? = null,
){
CustomSwitch(switch1Title, switch1Checked, OnSwitch1Changed)
CustomSwitch(switch2Title, switch2Checked, OnSwitch2Changed)
//Other composables
}
Run Code Online (Sandbox Code Playgroud)
免责声明:在这个例子中,这个PreferencesCard可组合项确实很愚蠢,因为它什么都不做,并且可以被一个Column或某种仅采用函数体的“开放”可组合项替换。但这只是因为我想让代码保持简单,请假设它有其他子级并且也做自己的事情。
使用这种方法,当我们在可组合项的层次结构中向上时,我们需要携带所有子参数,从而导致父参数列表非常长。这个问题是声明式 UI 框架的特征,例如在 React 中,它被称为“属性钻取”。它会产生复杂且难以维护的代码,因为子级中的任何更改(例如:添加新参数)都会导致其所有父级发生更改。它违背了封装的概念。
如果我们仍然希望保持父可组合项不可变,一种解决方案是封装子状态和侦听器,以便参数列表更短:
data class …Run Code Online (Sandbox Code Playgroud) android immutability kotlin android-jetpack-compose prop-drilling
从Objective-C调用C代码是否有任何性能提升?
我读过某个地方,与使用函数调用的其他语言相比,消息传递速度较慢.因此,如果我从Objective-C代码调用C函数,我是否避免了消息传递开销?
在优化性能时,是否建议使用C语言编写最关键的函数和过程而不是使用Objective-C对象?
编辑:
鉴于有关过早优化和代码可读性的警告的数量,我想澄清我没有考虑常规应用程序,但非常具体的应用程序,如:
通常,函数或过程不需要OO设计,并且打算使用参数多次调用.
我需要为设备2.3及更高版本添加操作栏.
我最近知道appcompat v7支持库,它就是这样做的.
我已经按照支持库设置指南,一步一步,清理,构建和再次清理,重新启动eclipse,升级SDK和插件到最后一个版本(只是意识到SDK构建工具v19已经坏了,所以我不得不删除他们).两个小时后,我仍然无法建立我的项目.我收到这些错误:
[2013-11-13 00:00:00 - FooProject] D:\foo_project\android-support-v7-appcompat\res\values-v11\themes_base.xml:33: error: Error: No resource found that matches the given name: attr 'android:windowActionBar'.
[2013-11-13 00:00:00 - FooProject] D:\foo_project\android-support-v7-appcompat\res\values-v11\themes_base.xml:42: error: Error retrieving parent for item: No resource found that matches the given name 'android:Theme.Holo.Light'.
[2013-11-13 00:00:00 - FooProject] D:\foo_project\android-support-v7-appcompat\res\values-v11\themes_base.xml:44: error: Error: No resource found that matches the given name: attr 'android:windowActionBar'.
[2013-11-13 00:00:00 - FooProject] D:\foo_project\android-support-v7-appcompat\res\values-v14\themes_base.xml:31: error: Error retrieving parent for item: No resource found that matches the given …Run Code Online (Sandbox Code Playgroud) 我在磁盘上有一个本地项目,我想第一次将它上传到subversion.我们通常在当天使用TortoiseSVN(或subeclipse插件),但现在我们想直接从Android Studio进行.
我的本地项目是:
C:\\ParentDir\ProjectDir
该文件夹内有常用的目录:.gradle,.idea,app等.
我想将它上传到我刚刚在svn服务器中创建的repo:
svn://serverip/parentdir
最终的repo文件夹结构应如下所示:
svn://serverip/parentdir/ProjectDir/branchessvn://serverip/parentdir/ProjectDir/tagssvn://serverip/parentdir/ProjectDir/trunk我可以通过ProjectDir/trunk在svn存储库中手动创建文件夹然后选择"VCS - >导入到版本控制 - >导入到subversion"来成功上传项目.(顺便说一句,这个令人困惑的名字,应该被称为"导出到版本控制"而不是).但随后该项目仍然没有变化.显然,此操作仅在启用或未启用版本控制的情况下上载一次.
所以我接下来尝试的是"VCS - >导入版本控制 - >共享项目(颠覆)".这就造成了ProjectDir在服务器文件夹,并且还trunk,tags和branches子文件夹.该项目已正确上传,但最后给我一个错误:
*C:\\ParentDir is not a working copy*
在此之后,项目中的每个文件都显示为无版本(红色),即使更改了某些文件,更改列表也为空.
对我来说没有意义的是,在为整个项目启用VCS后,我需要逐个手动添加每个文件或文件夹.由于这个错误,一定有问题.
可能是什么问题呢?是否有第一次上传项目的安全操作序列?
我正在向库模块清单文件中添加一些组件.显然,${applicationId}即使我没有在库的build.gradle文件中声明它,也可以使用占位符.它声明的唯一位置是在主模块的build.gradle中.
所以我虽然如果我在主模块中添加了一个自定义占位符,它也可以工作.
简而言之:这似乎有效:
Library的AndroidManifest.xml:
<activity android:name="${applicationId}.LibraryActivity" ...>
Run Code Online (Sandbox Code Playgroud)
主模块的build.gradle:
defaultConfig {applicationId "package.name.here"...
Run Code Online (Sandbox Code Playgroud)
但这不是:
Library的AndroidManifest.xml:
<activity android:label="${customPlaceholder} ...>
Run Code Online (Sandbox Code Playgroud)
主模块的build.gradle:
defaultConfig {manifestPlaceholders = [customPlaceholder:"Foo"] ...}
Run Code Online (Sandbox Code Playgroud)
是否有理由而不是另一个?
android ×8
java ×2
ajax ×1
alarmmanager ×1
c ×1
eclipse ×1
firefox ×1
immutability ×1
iphone ×1
javascript ×1
kotlin ×1
long-press ×1
merge ×1
mocking ×1
objective-c ×1
onkeypress ×1
performance ×1
placeholder ×1
svn ×1
testing ×1
unit-testing ×1