小编Geo*_*tic的帖子

Kotlin和新的ActivityTestRule:@Rule必须是公开的

我正在尝试在Kotlin中为我的Android应用程序进行UI测试.由于使用ActivityTestRule的新系统,我无法使其工作:它正确编译,并在运行时,我得到:

java.lang.Exception: The @Rule 'mActivityRule' must be public.
    at org.junit.internal.runners.rules.RuleFieldValidator.addError(RuleFieldValidator.java:90)
    at org.junit.internal.runners.rules.RuleFieldValidator.validatePublic(RuleFieldValidator.java:67)
    at org.junit.internal.runners.rules.RuleFieldValidator.validateField(RuleFieldValidator.java:55)
    at org.junit.internal.runners.rules.RuleFieldValidator.validate(RuleFieldValidator.java:50)
    at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:170)
    at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.ParentRunner.validate(ParentRunner.java:344)
    at org.junit.runners.ParentRunner.<init>(ParentRunner.java:74)
    at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55)
    at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:38)
    at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
    at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:57)
    at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:45)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runner.Computer.getRunner(Computer.java:38)
    at org.junit.runner.Computer$1.runnerForClass(Computer.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98)
    at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84)
    at org.junit.runners.Suite.<init>(Suite.java:79)
    at org.junit.runner.Computer.getSuite(Computer.java:26)
    at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:691)
    at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:654)
    at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:329)
    at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:226)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
Run Code Online (Sandbox Code Playgroud)

以下是我宣称的mActivityRule:

RunWith(javaClass<AndroidJUnit4>())
LargeTest
public class RadisTest {

    Rule
    public val mActivityRule: ActivityTestRule<MainActivity> = …
Run Code Online (Sandbox Code Playgroud)

testing android kotlin android-espresso

246
推荐指数
5
解决办法
3万
查看次数

"当"语句与Java"切换"语句

Kotlin中的模式匹配很好,并且在90%的用例中,它不执行下一个模式匹配的事实很好.

在Android中,当数据库更新时,我们使用Java开关属性继续下一个案例,如果我们不休息让代码看起来像这样:

switch (oldVersion) {
    case 1: upgradeFromV1();
    case 2: upgradeFromV2(); 
    case 3: upgradeFromV3();
}
Run Code Online (Sandbox Code Playgroud)

因此,如果有人拥有数据库版本1的应用程序而错过了使用DB v2的应用程序版本,他将获得执行所需的所有升级代码.

转换为Kotlin,我们得到一个混乱:

when (oldVersion) {
    1 -> {
        upgradeFromV1()
        upgradeFromV2()
        upgradeFromV3()
    }
    2 -> {
        upgradeFromV2()
        upgradeFromV3()
    }
    3 -> {
        upgradeFromV3()
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们只有3个版本,想象当DB达到版本19时:/

无论如何,当以与开关相同的方式行动时?我试着继续没有运气.

java switch-statement kotlin

55
推荐指数
4
解决办法
3万
查看次数

如何在Android设备上管理调试和发布版本?

我是Android开发人员的新手,我几乎准备好发布我的应用程序的第一个版本:)

在我的手机上测试签名版本apk时,它拒绝安装,因为调试版本随调试签名一起安装.

所以我必须卸载调试版本,但它删除了我的所有数据库(它将对我正在测试它的朋友这样做).

有没有办法管理同一个应用程序的调试和发布版本而不会丢失数据?

android conflict device signature

26
推荐指数
2
解决办法
6994
查看次数

DialogFragment中的Kotlin合成和自定义布局

假设我有这样的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ImageButton
    android:id="@+id/add_dep_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_marginEnd="5dp"
    android:layout_marginRight="5dp"
    android:src="@android:drawable/ic_input_add" />

<EditText
    android:id="@+id/add_dep_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/add_dep_btn"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignTop="@id/add_dep_btn"
    android:layout_marginLeft="5dp"
    android:layout_marginStart="5dp"
    android:layout_toLeftOf="@id/add_dep_btn"
    android:layout_toStartOf="@id/add_dep_btn" />

<android.support.v7.widget.RecyclerView
    android:id="@+id/dep_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/add_dep_btn" />

<TextView
    android:id="@+id/empty_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/add_dep_text"
    android:layout_margin="20dp"
    android:gravity="center"
    android:text="@string/no_dep"
    android:textSize="22sp" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

我在DialogFragment中使用它:

class DepartmentChoiceDialog : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(activity)
        builder.setTitle(R.string.choose_or_create_dep)
            .setView(R.layout.department_chooser_dialog)
            .setNegativeButton(android.R.string.cancel, { d, i ->
                d.cancel()
            })
        return builder.create()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用合成来引用小部件:

override …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-android-extensions

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

kotlin android proguard错误

我正在尝试构建一个apk并对其进行预测,但它失败的消息如下:

Error:ProGuard: [radis] Warning: kotlin.dom.EventListenerHandler: can't find superclass or interface org.w3c.dom.events.EventListener
Error:ProGuard: [radis] Warning: kotlin.dom.CloseableEventListener: can't find referenced class org.w3c.dom.events.EventTarget
Error:ProGuard: [radis] Warning: kotlin.dom.CloseableEventListener: can't find referenced class org.w3c.dom.events.EventListener
Error:ProGuard: [radis] Warning: kotlin.dom.DomPackage: can't find referenced class org.w3c.dom.events.MouseEvent
Error:ProGuard: [radis] Warning: kotlin.dom.DomPackage: can't find referenced class org.w3c.dom.events.Event
Run Code Online (Sandbox Code Playgroud)

我添加了我的proguard.cfg,-dontwarn在kotlin.dom.**但它没有帮助.

android proguard kotlin

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

如何使用 StructOpt 将参数解析为 Vec 而不将其视为多个参数?

我有这个代码:

#[derive(StructOpt)]
pub struct Opt {
    /// Data stream to send to the device
    #[structopt(help = "Data to send", parse(try_from_str = "parse_hex"))]
    data: Vec<u8>,
}

fn parse_hex(s: &str) -> Result<u8, ParseIntError> {
    u8::from_str_radix(s, 16)
}
Run Code Online (Sandbox Code Playgroud)

这适用于myexe AA BB,但我需要将其myexe AABB作为输入。

有没有办法将自定义解析器传递structopt给解析AABBVec<u8>? 我只需要解析第二种形式(无空格)。

我知道我可以分两步完成(存储到String结构中的 a 然后解析它,但我喜欢我Opt的所有东西都有最终类型的想法。

我尝试了这样的解析器:

fn parse_hex_string(s: &str) -> Result<Vec<u8>, ParseIntError>
Run Code Online (Sandbox Code Playgroud)

StructOpt大约类型不匹配宏恐慌,因为它似乎产生Vec<Vec<u8>>

rust structopt

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

kotlin + espresso:未找到任何活动

一年后回到 Android 开发,我又对浓缩咖啡感到困惑-_-

我只是想设置一个简单的浓缩咖啡测试,但它失败了:

java.lang.RuntimeException:未找到活动。您是否忘记通过调用 getActivity() 或 startActivitySync 或类似方法启动活动?

事实上,我没有看到正在启动的应用程序。这是代码:

@RunWith(AndroidJUnit4::class)
@LargeTest
class EfficioTest {
    @get:Rule @JvmField var activityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)

    private fun getActivity() = activityRule.activity

    @Test fun testInitState() {
        onView(withId(R.id.store_spinner)).check(matches(isDisplayed()))
    }
}
Run Code Online (Sandbox Code Playgroud)

MainActivity 位于清单中,并且在使用启动器启动时工作正常。

我错过了什么?

android kotlin android-testing android-espresso

6
推荐指数
1
解决办法
4523
查看次数

一次不能多次借用“*self”作为可变的

我不明白这个借用检查器错误:

pub fn wait_for_device(&mut self) -> RoxResult<hidapi::HidDevice> {
    let mut device = self.open_device();
    let start = time::Instant::now();
    while device.is_err() {
        device = self.open_device();
        if start.elapsed().as_secs() > 30 {
            return Err("Can't reconnect to device".to_owned());
        }
    }
    Ok(device.expect("Out of while so we should have a device"))
}

pub fn open_device(&mut self) -> RoxResult<hidapi::HidDevice> {
    let device_info = &self.list[0]; 
    if let Ok(device) = self.api.open(device_info.vendor_id, device_info.product_id) {
        self.current_device = Some(device_info.clone());
        Ok(device)
    } else {
        Err(format!(
            "Error opening device vip: {:x} pid: {:x}",
            device_info.vendor_id, device_info.product_id …
Run Code Online (Sandbox Code Playgroud)

rust

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

有没有办法否定Option <bool>?

我正面临一个提供的函数,它接受Into<Option<bool>>一个参数,但我想传递它与我当前bool相反的值.

rust

4
推荐指数
1
解决办法
249
查看次数

如何在Rust中获取当前平台的行尾字符序列?

我正在寻找一种方法来在运行时获得平台行结束字符序列(Windows的CRLF,Linux/macOS的LF).

rust

3
推荐指数
1
解决办法
766
查看次数