小编gre*_*qrl的帖子

如何右键对齐Android微调器

我正在尝试右对齐Android微调器的文本.我已经通过Stack Overflow并尝试了推荐的解决方案,但它不适合我,所以,我对我做错了什么有点困惑.我的感觉是,由于我犯了错误,我的布局没有被正确拾取.

我的activity.xml文件

<Spinner
android:id="@+id/spinnerStoreType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
Run Code Online (Sandbox Code Playgroud)

在res\layout下,我创建了一个名为simple_spinner_item.xml的文件

<?xml version="1.0" encoding="utf-8"?>

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="40sp"
    android:textColor="#FFFFFF"
    android:padding="10dip"
    android:gravity="right"
    />
Run Code Online (Sandbox Code Playgroud)

最后,在我的活动中,我使用如下:

spinnerStoreType = (Spinner) findViewById(R.id.spinnerStoreType);
ArrayAdapter<CharSequence> adapter =    
ArrayAdapter.createFromResource(this,
R.array.transaction_store_array, android.R.layout.simple_spinner_item);

adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
spinnerStoreType.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)

所以,我相信正在使用的simple_spinner_item是默认的,Android的.我不清楚如何使用我的自定义.我认为如果它有相同的名称会自动发生?

我们非常感谢任何帮助.

layout android spinner right-align

6
推荐指数
2
解决办法
7731
查看次数

单元测试BroadcastReceiver

我一直在试图弄清楚如何对我的BroadcastReceiver进行单元测试,我已经看过StackOverflow和其他网站,但我无法找到问题的解决方案.

在我的mainActivity中,我有以下两个功能:

private void registerNetRcvr(){

    if (!isRcvrRegistered) {        
        isRcvrRegistered = true;
        registerReceiver(receiver, new IntentFilter("android.net.wifi.STATE_CHANGE"));
        registerReceiver(receiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
    }
}

private BroadcastReceiver receiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {

        NetworkHandler.NetworkInfo netInfo = NetworkHandler.handleBcastReceiver(context);

        if (netInfo!=null){
            handleInfoChange(netInfo);
        } else {
            handleInfoChange(null);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

registerNetRcvr是从onResume函数中调用的(同样我有一个从onPause调用的注销).

从上面可以看出,我有一个函数(handleBcastReceiver)被调用来处理onReceive事件,因此有另一个类,然后有一个从这个函数调用的各种私有函数.

只是稍微复杂一点......在调用onReceive函数时,如上所述,'handleBcastReceiver'函数需要'retreive'正确的数据......并且因此会调用实际检索适当的系统数据如下:

private static NetworkInfo getWiFiNetworkInfo(Context context) {

    ConnectivityManager connManager = (ConnectivityManager)
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
}
Run Code Online (Sandbox Code Playgroud)

我相信我应该模仿onReceive回调的行为,但我想模拟在调用getWiFiNetworkInfo期间从系统返回的内容.

我的想法是我应该使用RoboElectric这样做,因为它可以遮蔽BroadcastReceiver/ConnectivityManager.我也看过Mockito然而我相信RoboElectric是我需要的,但我接受我可能是错的.据我所知,RoboElectric允许我模仿'Android系统',Mockito允许我模拟我自己的课程.

目前我只是看不出如何测试BroadcastReceiver.另外,我不清楚是否应该运行模拟器来执行此操作,或者只是"运行"我的单元测试,因为"阴影"应该包含我需要的所有内容.最后,如果我要影响BroadcastReceiver,我如何通过此影子过程使WIFI"启用"或"禁用"?事实上,我应该模拟BroadcastReceiver还是只是连接管理器...我真的很困惑!

到目前为止我所做的是在我的应用程序的测试部分(而不是'androidTest'部分)中创建一个BroadcastReceiverTest类.我可以对函数进行常规的简单单元测试,我只是坚持如何模拟这个'系统'行为.

一如既往,非常感谢任何帮助.

android unit-testing mockito robolectric android-broadcastreceiver

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

在 Kotlin 中传递需要参数作为回调的函数

我正在使用 Kotlin(用于 Android 开发)并且我正在尝试将一个函数传递给另一个我想用作回调的函数。代码非常基础,因为这只是现在的测试。

请注意,虽然您可能想知道为什么我使用这样的回调,但它只是为了测试目的。在我的实际应用程序中,我希望将回调分配给一个值,并在异步方法完成后稍后调用它。

我不能使用协程等......因为此代码将用于多平台解决方案,因此我对制作函数回调感兴趣。

我的 Kotlin 类将接收函数(回调)

class SampleApi {
    private var counter: Int = 0

    fun startCounting(initialValue: Int, counterCallBack: (resultVal: Int) -> Unit) {
        counter = initialValue

        counter++

        counterCallBack(counter)
    }
}
Run Code Online (Sandbox Code Playgroud)

上面是一个基本类,它有一个函数startCounting,它将接收一个整数和一个函数。然后它将调用该函数并传入一个值。

调用代码

class MainActivity : AppCompatActivity() {

    private val sampleApi: SampleApi = SampleApi()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        sampleApi.startCounting(5, {counterCallBack()})
    }

    private fun counterCallBack(counter: Int) {
        Toast.makeText(this, counter.toString(), Toast.LENGTH_SHORT).show()
    }
}
Run Code Online (Sandbox Code Playgroud)

上面显示的示例代码包含回调方法(期望接收一个整数),并包含从期望接收函数的 SampleApi 类对 startCounting 方法的调用。

我遇到的问题是这一行:

sampleApi.startCounting(5, {counterCallBack()})
Run Code Online (Sandbox Code Playgroud)

Android Studio 中的错误是由于一个值​​是该函数需要一个整数,因此我收到错误: …

lambda android function kotlin

5
推荐指数
2
解决办法
3695
查看次数

为 Kotlin 多平台项目运行单元测试时出错

我按照本网站的教程使用 Intelli-j IDE(社区版)创建了一个 Kotlin 多平台项目:

https://medium.com/@cafonsomota/set-up-your-first-kotlin-multiplatform-project-for-android-and-ios-april-2020-258e2b1d9ef4

我没有遵循的是教程的 xCode 部分,因为此时虽然我希望这个项目是多平台的,但我的主要兴趣是 Android。

当我运行common示例测试时,我看到错误: e: org.jetbrains.kotlin.konan.MissingXcodeException: An error occurred during an xcrun execution. Make sure that Xcode and its command line tools are properly installed.

我还可以看到,对于相关配置,任务详细说明如下: cleanIosTest iosTest

这就是我收到错误的原因。

我不知道如何更改Sample Test以不运行该配置。我尝试删除这些任务、应用并保存,但当我运行它们时它们不断重新出现。我在 build.gradle 文件中看不到任何表明 iOS 特定于测试的内容。

构建.gradle.app

    plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.3.72'
}
repositories {
    google()
    jcenter()
    mavenCentral()
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId 'org.jetbrains.kotlin.mpp_app_android'
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1 …
Run Code Online (Sandbox Code Playgroud)

android unit-testing intellij-idea kotlin kotlin-multiplatform

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

单元测试:如何验证和模拟 Android 中 RxJava 中的 Observable 的 onCompleted

我正在尝试为使用 Retrofit 2、Mockito 1.10 和 RXJava 1.0 的 Android 应用程序编写一些单元测试。我没有使用支持 lambda 的 Java 版本!

我的代码使用 Observables,我可以执行以下操作:

when(myAPI.Complete(anyString(), any(MyContainer.class)))
        .thenReturn(Observable.<GenericResponse>error(new Throwable("An error has occurred!")));

Subscriber genericResponseSubscriber = mock(Subscriber.class);

myPresenter.myUseCase(id, container, genericResponseSubscriber);

verify(genericResponseSubscriber, times(1)).onError(any(Throwable.class));
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,并允许我抛出错误并在测试中捕获它。

我也需要做的(当然):) 是捕捉积极的条件。我觉得这很明显,但找不到我需要的答案。

如何捕获 onComplete 和 onNext 案例?

我知道 onComplete 的验证将是......

验证(genericResponseSubscriber, times(1)).onCompleted();

但我看不出我的“何时”条款应该是什么。我尝试了以下但失败了:

GenericResponse response = new GenericResponse();
response.setSuccess(true);

when(myAPI.orderComplete(anyString(), any(MyContainer.class)))
        .thenReturn(Observable.just(response));

Subscriber genericResponseSubscriber = mock(Subscriber.class);

myPresenter.myUseCase(id, container, genericResponseSubscriber);

verify(genericResponseSubscriber, times(1)).onCompleted();
Run Code Online (Sandbox Code Playgroud)

这里的失败是subscriber.onStart() 被调用了。

所以,我想知道的是,我如何模拟和验证“onComplete”和“onNext”调用,更重要的是我应该看起来能够自己解决这个问题而不是问!:)

与往常一样,任何帮助表示赞赏。

编辑..

我的 onError 工作测试用例..

    public void UseCaseOnError() throws Exception {?        
     String id …
Run Code Online (Sandbox Code Playgroud)

android unit-testing mockito rx-java

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

在RxJava 2/RxAndroid 2中使用'map'的问题

我正在尝试为Android学习RXJAVA.部件有意义,我仍然对很多其他部分感到困惑,但是,考虑到一些时间,我希望它会更有意义.

目前我在使用'地图'功能时遇到了麻烦.我收到错误但无法弄清楚如何解决它.

在我分享我的代码之前,我将解释我的理解..在一个简单的层面上.. Observable - 发出数据的代码.Observer - 处理发出数据的代码.Map - 接收类型A的数据并将其返回处理或作为类型B的代码.

所以,考虑到这一点:

在gradle我有:

compile 'io.reactivex.rxjava2:rxjava:2.0.1' 
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
Run Code Online (Sandbox Code Playgroud)

如果我有:

    //declaration at top of file
    private Observable<Integer> myIntObservable;
    private Observer<Integer> myIntObserver;
    private Observer<String> myStringObserver;
    private Observable<String> myStringObservable;

    //usage in a function
    myIntObserver = new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Integer value) {
            Toast.makeText(getApplicationContext(), "" + value, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {
            Toast.makeText(getApplicationContext(), "Int Observer Async Complete", Toast.LENGTH_SHORT).show(); …
Run Code Online (Sandbox Code Playgroud)

java android reactive-programming rx-java rx-android

2
推荐指数
1
解决办法
3622
查看次数

两个应用程序使用sharedUserID - createPackageContext问题

我有两个单独的应用程序.我希望appB能够访问appA代码中的数据库.我不想在这个例子中使用内容提供者.

我已经阅读了有关这方面的帖子,并按照说明(在两个Android应用程序之间共享SQLite数据库?).

我做了什么:

AppA的Android Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.micode.primaryapplication">

    <application
        android:sharedUserId="com.micode.sharedid"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

AppB的Android清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.micode.secondaryapplication">

    <application
        android:sharedUserId="com.micode.sharedid"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

AppA创建了一个数据库,AppB需要访问该数据库.

AppB中使用以下代码:

package com.micode.secondaryapplication;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import …
Run Code Online (Sandbox Code Playgroud)

android shared-data

0
推荐指数
1
解决办法
2344
查看次数

在 Android 单元测试中为 doNothing.when 子句接收 Mockito UnfinishedStubbingException

首先,我的设置是 RXJava 1、Retrofit 2,我使用的是 Java 7。

我有一个方法,当它被调用时,会将一个原子布尔值设置为 true。

然后该方法调用改造 API。

完成后,超时等......原子布尔值重置为false。

因此,我想测试一下,当我调用我的方法时,Atomic Boolean 设置为 true。

因此,我执行以下操作:

    assertFalse(orderUseCase.isOrderInProcess());

    orderUseCase.execute(id, orderWrapper, ts);

    assertTrue(orderUseCase.isOrderInProcess());
Run Code Online (Sandbox Code Playgroud)

测试布尔值是否为假。执行我的用例测试布尔值是否为真。

现在,为了执行最后一个测试,我需要确保 API 在调用时什么都不做(execute 方法将调用改造 API。

为了尝试什么都不做,我在测试用例的开头使用了以下行。

doNothing().when(orderAPI.orderComplete(anyString(), any(OrderWrapper.class)));
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at com.tfds.xms.unit_test.SingleTest.TestAtomicBooleanLocked(SingleTest.java:90)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction …
Run Code Online (Sandbox Code Playgroud)

android unit-testing mockito powermock rx-java

0
推荐指数
1
解决办法
5295
查看次数