我最近在很多Android应用和游戏中都注意到了这种模式:当点击后退按钮"退出"应用程序时,Toast
会出现类似于"请再次单击BACK退出"的消息.
我想知道,因为我越来越频繁地看到它是一个内置的功能,你可以以某种方式访问活动?我查看了许多类的源代码,但我似乎无法找到任何相关内容.
当然,我可以考虑几种方法来轻松实现相同的功能(最容易的是在活动中保留一个布尔值,表明用户是否已经点击过一次......)但是我想知道这里是否有东西.
编辑:正如@LAS_VEGAS所说,我并不是指传统意义上的"退出".(即终止)我的意思是"回到应用程序启动活动启动之前打开的任何东西",如果这是有意义的:)
我需要匹配包含值且没有给定前缀的所有行.
示例:我想要所有包含word
前缀的行prefix
所以:
foobar -> no match
prefix word -> no match
prefix word suffix -> no match
word -> MATCH
something word -> MATCH
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的:
(?!prefix)word
Run Code Online (Sandbox Code Playgroud)
似乎没有做我想要的
我想让用户在几个不同的主题之间做出选择,并且想知道这是否是一种正常的做事方式.我用这种方法进行了一些测试并且它有效,但我认为可能有更好的方法并认为它可能会在以后引起一些问题,所以想问一下.
我正在考虑为每个主题创建一个不同的布局,并且onCreate
只是为setContentView()
方法切换.我首先加载一个保存的SharedPreference
值(整数),具体取决于显示相应布局的值.显然,用户可以SharedPreference
使用按钮或其他内容更改值.
由于这些布局基本相同但颜色不同,我想TextViews
在每个布局文件中为我和其他视图使用相同的ID .我的主要问题是这会导致问题吗?
抱歉没有代码的文本墙.我想对这种情况大致了解良好做法.提前致谢.
我目前正在开发一款将数据保存到SQLite数据库中的Android游戏.这不是真正的"敏感"数据,但我不希望用户能够修改它(出于游戏平衡的明显原因,因为它会作弊).当手机植根时,访问和修改SQLite数据库非常容易(市场上有很多应用程序).
那么我是否应该担心这一点,或者考虑使用带有根电话的用户可以做任何他们想做的事情,包括作弊,这是他们的选择?或者我可以以某种方式加密我不希望他们修改的数据,或添加MD5校验和或类似的东西?
另一种方法是完全放弃SQLite并使用某种二进制文件和游戏数据.
如果你们中的一些人已经遇到过类似的问题,你们采取了哪些方法,以及Android游戏开发社区的"良好实践",请告诉我们.
谢谢.
我希望在特定条件之后显示一个对话框,但是对于现在的演示,我想从扩展应用程序的类中显示一个对话框.这是我的代码
public class ControlApplication extends Application
{
@Override
{
super.onCreate();
final Dialog dialog = new Dialog ( getApplicationContext() );
dialog.setTitle("zakasssssssssssssssssss");
dialog.setCancelable(false);
dialog.show();
}
Run Code Online (Sandbox Code Playgroud)
}
但是在dialog.show()我得到的错误就像
Attempted to add window with non-application token WindowToken{4067a268 token=null}. Aborting.
D/AndroidRuntime( 1923): Shutting down VM
W/dalvikvm( 1923): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 1923): FATAL EXCEPTION: main
E/AndroidRuntime( 1923): java.lang.RuntimeException: Unable to create application
com.test.shrenik.ControlApplication: android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
E/AndroidRuntime( 1923): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3275)
E/AndroidRuntime( …
Run Code Online (Sandbox Code Playgroud) 在我的上一个项目中,我们的单元测试几乎达到了100%cc,因此我们几乎没有任何错误.但是,由于单元测试必须是白盒(你必须模拟内部函数来获得你想要的结果,所以你的测试需要知道你的代码的内部结构)任何时候我们改变函数的实现,我们不得不也改变测试.请注意,我们没有更改函数的逻辑,只是实现.这非常耗时,感觉好像我们的工作方式不对.由于我们使用了所有适当的OOP准则(特别是封装),每次我们更改实现时,我们都不必更改其余的代码,但必须更改单元测试.感觉好像我们正在为测试服务,而不是为我们服务.
为了防止这种情况,我们中的一些人认为单元测试应该是黑盒测试.如果我们创建整个Domain的一个大模拟并为一个地方的每个类中的每个函数创建一个存根,并在每个单元测试中使用它,那么这是可能的.当然,如果特定的测试需要调用特定的内部函数(就像确保我们写入DB一样),我们可以覆盖我们的存根.
因此,每次我们更改函数的实现(比如添加或替换对帮助函数的调用)时,我们只需要更改我们的主要大模拟.即使我们确实需要改变一些单元测试,它仍然会比以前少得多.
其他人认为单元测试必须是White Box,因为不仅要确保你的应用程序在特定的地方写入数据库,你要确保你的应用程序不会在其他任何地方写入数据库,除非你特别期望它.虽然这是一个有效的观点,但我认为值得花时间编写白盒测试而不是黑盒测试.
总之,有两个问题:
您如何看待黑匣子单元测试的概念?
您如何看待我们希望实施该概念的方式?你有更好的想法吗?
我正在尝试最终将UI测试添加到我的Android应用程序中,以增加覆盖率(我所有其他层都经过适当测试,因此我的所有错误现在都来自UI ...)我开始使用ActivityInstrumentationTestCase2
我的基类作为模拟器单元 - 测试,简单的事情很容易检查和工作.
但现在,我正在尝试按预期检查对话框,我不知道该怎么做.
我的测试:
public void testOpensAboutDialogWhenAboutButtonClicked() {
final MyActivity activity = getActivity();
final Instrumentation instrumentation = getInstrumentation();
final Button aboutButton = (Button) activity.findViewById(R.id.about);
TouchUtils.clickView(this, aboutButton);
// how to test for the AboutDialog?
}
Run Code Online (Sandbox Code Playgroud)
现在我的对话框没有id,所以我无法使用findViewById获取指向它的指针.它是使用可用的构建器类创建的:
final AlertDialog about = new AlertDialog.Builder(parent)
.setTitle(parent.getString(R.string.about_title))
.setCancelable(true)
.setIcon(R.drawable.skull)
....
Run Code Online (Sandbox Code Playgroud)
任何想法,或指向教程的指针?
编辑:要回答Jens评论,我没有使用托管对话框,只是创建AlertDialog并使用.show()显示它
我正在使用Selenium将web测试添加到我的项目中.我已经有一堆测试用于检查特定元素:
final WebElement dateElement = web.findElement(By.id(elementId));
Run Code Online (Sandbox Code Playgroud)
这很好用.现在我有另一个要求.这是在我生成的页面中:
<input type="text" id="dateElement" name="dateElement" value="bunch of monkeys" tabindex="101" placeholder="yyyy-mm-dd">
<span class="error">dateElement is an invalid date</span>
Run Code Online (Sandbox Code Playgroud)
如何获取错误消息?我想要一些允许我在dateElement之后请求类"错误"的span元素的东西.
(这个错误消息是由Spring MVC批准的,因此直接更改它并不容易.可能我猜,但我不愿意).
欢迎任何其他想法.
我正在尝试使用sql-maven-plugin在Oracle 11数据库上执行PL/SQL脚本.虽然脚本是有效的PL/SQL(据我所知),执行会给我一个PLS-00103错误:
SQL脚本:(drop_all_tables.sql)
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
我的插件配置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.5</version>
<dependencies>
<dependency>
<groupId>oracle</groupId>
<artifactId>jdbc</artifactId>
<version>11.2.0.2.0</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>create-schema</id>
<phase>process-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>${jdbc.url}</url>
<username>${jdbc.username}</username>
<password>${jdbc.password}</password>
<autocommit>true</autocommit>
<srcFiles>
<srcFile>src/main/resources/sql/drop_all_tables.sql</srcFile>
</srcFiles>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这是Maven执行的输出:
[ERROR] Failed to execute: BEGIN
EXECUTE IMMEDIATE 'DROP TABLE MY_TABLE';
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] ORA-06550: line 2, column 43:
PLS-00103: Encountered …
Run Code Online (Sandbox Code Playgroud) 我在同一个文件中有以下程序.我已经同步了run()方法.
class MyThread2 implements Runnable {
Thread t;
MyThread2(String s) {
t=new Thread(this,s);
t.start();
}
public synchronized void run() {
for (int i=0;i<3;i++) {
System.out.println("Thread name : "+ Thread.currentThread).getName());
try {
t.sleep(1000);
}
catch (InterruptedException e) {
e.getMessage();
}
}
}
}
class TestSync {
public static void main(String[] args) {
MyThread2 m1=new MyThread2("My Thread 1");
c.fun();
}
}
class c {
static void fun() {
MyThread2 m1=new MyThread2("My Thread 4");
}
}
Run Code Online (Sandbox Code Playgroud)
输出是
Thread name : My Thread 1 …
Run Code Online (Sandbox Code Playgroud) android ×5
java ×3
unit-testing ×2
back-button ×1
encryption ×1
jdbc ×1
maven-2 ×1
plsql ×1
protection ×1
regex ×1
selenium ×1
sql ×1
sqlite ×1
synchronized ×1
testing ×1