小编Age*_*opf的帖子

Android Studio 3.0 Canary 1:Kotlin测试或Java测试引用Kotlin类失败

UPDATE

此处已针对此问题提交了一个错误:https: //youtrack.jetbrains.com/issue/KT-17951

更新2

该错误已在Android Studio 3.0 Canary 3中修复

原帖

我刚刚开始使用Android Studio 3.0,我从一开始就启用了kotlin支持.我在我的项目中写了一个非常简单的Kotlin类:

data class Wallet(val coins: Int) {
    fun add(value: Int): Wallet = Wallet(coins + value)
    fun substract(value: Int): Wallet = if (coins > value) Wallet(coins + value) else throw InsufficientFundsException()
}
Run Code Online (Sandbox Code Playgroud)

现在我想测试这个类,首先我在Kotlin写了一个本地运行的unittest(测试目录):

class WalletTestKotlin {

    @Throws(Exception::class)
    @Test
    fun add() {
        Assert.assertEquals(22, Wallet(20).add(2).coins.toLong())
        Assert.assertNotEquals(5, Wallet(2).add(13).coins.toLong())
    }
}
Run Code Online (Sandbox Code Playgroud)

它编译并运行但错误消息:

未找到类:"com.agentknopf.hachi.repository.model.WalletTestKotlin"空测试套件.

因此我用Java重新编写了测试:

public class WalletTest {

    @Throws(exceptionClasses = Exception.class)
    @Test
    public void add() {
        Assert.assertEquals(22, new Wallet(20).add(2).getCoins());
        Assert.assertNotEquals(5, new …
Run Code Online (Sandbox Code Playgroud)

java junit android kotlin android-studio

37
推荐指数
2
解决办法
5157
查看次数

Android的CameraInfo.orientation是否正确记录?错误地实施了?

在Android中,您可以Camera通过检索a来获取a 的属性的描述CameraInfo.我对方向很感兴趣,如http://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation所述.

然而,文档似乎与我的所有四个设备的行为方式不一致,而且,我有第五个设备的消息,这个设备看起来固定不变.

特别是,文档说:

该值是摄像机图像需要顺时针旋转的角度,因此它在显示屏上以其自然方向正确显示....例如,假设设备具有自然高的屏幕.后置摄像头传感器安装在横向上.你在看屏幕.如果相机传感器的顶部以自然方向与屏幕的右边缘对齐,则值应为90.如果前置摄像头传感器的顶部与屏幕右侧对齐,则值应为是270.

但在所述示例中,相机图像相对于自然高的方向顺时针旋转90度,而不是相反.也就是说,顶部与设备右侧对齐的图像需要顺时针旋转270度才能与设备的顶部对齐.

至少,我的所有四个设备都会为此值报告"90",并且当保持在自然方向时,所有设备的行为都好像相机的顶部是设备的右侧.也就是说,图像必须顺时针旋转270度,而不是90度,以匹配自然方向.这个例子似乎是对的; 第一行没有.

这个示例代码似乎支持我的结论,因为它只在方向被解释为上面时才给出正确的结果.

奇怪的是,我有来自一个用户设备的记录证据,显示它有时报告该值为90,其他时间报告为0!它应该是相机如何坐在设备中的物理属性,对吧?

  1. 任何人都可以确认文档的第一行实际上是错误的,这个例子是对的吗?
  2. 有没有人观察到价值的变化CameraInfo.orientation?在文档中是否有证据证明这是合法行为,或者它可能是设备中的错误?
  3. 任何其他相关的评论,经验,陷阱我还没有遇到过?

camera android orientation

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

Android:将位图转换为单色位图(每像素1位)

我想将Bitmap打印到移动蓝牙打印机(Bixolon SPP-R200) - SDK不提供direkt方法来打印内存中的图像.所以我想过转换像这样的Bitmap:

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Run Code Online (Sandbox Code Playgroud)

到单色位图.我使用Canvas在上面给出的Bitmap上绘制黑色文本,效果很好.但是,当我将上面的位图转换为ByteArray时,打印机似乎无法处理这些字节.我怀疑我需要一个每像素一位的数组(一个像素将是白色= 1或黑色= 0).

由于似乎没有方便的,开箱即用的方式,我有一个想法是使用:

bitmap.getPixels(pixels, offset, stride, x, y, width, height)
Run Code Online (Sandbox Code Playgroud)

获取像素.我假设,我必须按如下方式使用它:

int width = bitmap.getWidth();
int height = bitmap.getHeight();

int [] pixels = new int [width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
Run Code Online (Sandbox Code Playgroud)

但是 - 我不确定一些事情:

  • 在getPixels中 - 简单地将宽度作为"Stride"参数传递是否有意义?
  • 我想我必须评估每个像素的颜色信息,并将其切换为黑色或白色(我将这个值写入一个新的目标字节数组,我最终会传递给打印机)?
  • 如何最好地评估每个像素颜色信息,以确定它应该是黑色还是白色?(渲染的位图在白色背景上是黑色疼痛)

这种方法有意义吗?有没有更简单的方法?仅仅将位图设置为黑白是不够的,主要问题是将每个像素的颜色信息减少为一位.

UPDATE

根据Reuben的建议,我首先将Bitmap转换为单色Bitmap.然后我将迭代每个像素:

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

    // …
Run Code Online (Sandbox Code Playgroud)

android monochrome bitmap

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

Android Studio:Gradle Product Flavors:定义自定义属性

我正在Gradle(Android Studio)中构建Android应用程序的不同产品风格.

因此我定义了以下产品口味:

android {

    project.ext.set("customer", "")
    project.ext.set("server", "")

    //Configuration happens here - code removed for readability

    buildTypes {

        debug {
            server = "test"
        }

        release {
            server = "release"
        }
    }

    //Available product flavors
    productFlavors {
        customerA{
            customer = "a"
        }
        customerB{
            customer = "b"
        }
        customerC{
            customer = "c"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,稍后,当我在我的一个构建任务中访问定义的项目属性"customer"(其值在我正在构建的产品风格中设置)时,即使iam构建customerA,它也始终具有值"c"(在这种情况下,财产客户应该是"a"而不是"c").例如,我稍后执行以下任务:

preBuild << {
    println "Building customer: " + customer
}
Run Code Online (Sandbox Code Playgroud)

它始终打印:

建立客户:c

所以我猜有一些覆盖发生?可能与配置VS执行阶段有关?不知道如何/为什么,所以任何帮助都非常感谢.

更新:或者它会让我进一步确定产品风格的名称(没有附加到它的构建类型名称)和构建类型(再次:没有产品风味名称前置),在gradle构建的执行阶段.

考虑到上述配置,预期的产品风味名称将是:customerA,customerB和customerC.

android gradle android-gradle-plugin

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

Android @Singleton上的Dagger 2注释类没有被注入

我目前正在尝试将Dagger 2集成到Android应用程序中.我的项目设置如下:

  • 图书馆
  • 应用程序(取决于库)

在我的库项目中,我定义了一个类,我稍后将其注入到库中的其他需要它的类(活动和常规类)以及应用程序项目中.

@Singleton
public class MyManager{
  @Inject
  public MyManager(){
    //Do some initializing
  }
}
Run Code Online (Sandbox Code Playgroud)

现在 - 例如在我的片段或活动或常规类中,我将按如下方式注入上述Singleton:

public class SomeClass{

  @Inject
  MyManager myManager;
}
Run Code Online (Sandbox Code Playgroud)

或者我想,因为在实践中,myManager总是为空.显然它的构造函数从未被调用过,所以我想我必须错过配置方面的东西?或者我可能误解了文档,但这并不意味着以这种方式工作?MyManager类的目的是成为应用程序范围内可访问的组件累积实体 - 这就是我选择@Singleton的原因.

UPDATE

为了避免混淆:我在评论中提到了我的组件,我认为 - 这是指"基于组件的设计"意义上的组件,与匕首无关.我上面列出了基于匕首的代码 - 我的代码中没有任何与dagger相关的代码.

当我开始添加@Component时,我遇到了一些编译器问题,因为我的dagger2设置不正确 - 请查看这个关于如何正确设置dagger2的真正有用的线程:https://stackoverflow.com/a/29943394/1041533

更新2

这是我更新的代码,基于G. Lombard的建议 - 我更改了代码如下 - 原始的Singleton在库项目中:

@Singleton
public class MyManager{
  @Inject
  public MyManager(){
    //Do some initializing
  }
}
Run Code Online (Sandbox Code Playgroud)

库项目中还有bootstrap类:

@Singleton
@Component
public interface Bootstrap {
    void initialize(Activity activity);
}
Run Code Online (Sandbox Code Playgroud)

然后我在我的活动中使用上面的Bootstrap类(在我的具体应用程序中,而不是在库项目中!但是我在库中也有访问Bootstrap以注入MyManager的类/活动):

public class MyActivity extends Activity{

    @Inject …
Run Code Online (Sandbox Code Playgroud)

java android dagger dagger-2

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

TextInputLayout:未聚焦时提示标签的颜色不同

我想做的事:

使用嵌入在TextInputLayout中的EditText时我想...

  1. 将标签的颜色设置为去焦点时将其设置为绿色并浮动在EditText上方,因为用户已经输入了一些值
  2. 将标签的颜色设置为非焦点并位于EditText内时,因为用户尚未输入值
  3. 我不想将所有EditTexts的提示文本颜色更改为RED,但仅当它们被包装在TextInputLayout中时(我不需要一般方法 - 一种特定的方法,如为每个TextInputLayout设置主题/样式)布局XML会很好)
  4. 当用户聚焦场时,保留(即不改变)用于为浮动标签着色的强调色(黄色).

我尝试过的:

在TextInputLayout上将下面设置为主题/样式确实满足1.但不满足2.

<style name="FloatingLabel" parent="Widget.Design.TextInputLayout">
    <item name="android:textColorHint">@color/red</item>
</style>
Run Code Online (Sandbox Code Playgroud)

在我的嵌入式EditText上设置特定颜色,将提示文本更改为另一种颜色:

 android:textColorHint="@color/text_placeholder_gray"
Run Code Online (Sandbox Code Playgroud)

当标签从其浮动位置移回Edittext作为提示(即没有文本)时,实际上会导致提示文本重叠.

设置这个:

<style name="TextAppearence.App.TextInputLayout" parent="@android:style/TextAppearance">
<item name="android:textColor">@color/main_color</item>
Run Code Online (Sandbox Code Playgroud)

在TextInputLayout上:

 <android.support.design.widget.TextInputLayout
  ...
   app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout" >
Run Code Online (Sandbox Code Playgroud)

更改提示标签颜色,但它也适用于聚焦状态 - 这意味着4不满足.

因为一张图片说的超过千字(所有字段都处于非聚焦状态):

在此输入图像描述

如何实现满足标准1-4的设置?

android android-layout android-theme android-styles

12
推荐指数
1
解决办法
2829
查看次数

EditText的光标位置

假设用户已将一些文本写入EditText,然后触摸屏幕上的其他位置,这会导致光标位置发生变化:如何确定新的光标位置?

android android-ui

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

Android:连接和打印到Bixolon SPP-R200

我想打印到Bixolon SPP-R200,就像我听说的那样,它是用android设置的更容易的移动蓝牙打印机之一.但是我不知道如何开始.

  1. 我想首先我必须通过蓝牙连接到打印机 - 为此我假设我采用原生的Android蓝牙API?

  2. 我可能需要某种SDK来向打印机发送数据 - 我在这里读到,有一个SDK,但浏览bixolon页面并没有产生任何结果(即没有SDK) - 我写信支持,但我是不要期待很快回答......

我想我还有其他问题(例如:你在.Net CF中可以将位图发送到打印机吗?)与该打印机的SDK紧密相关 - 如果它存在的话......

printing mobile android bluetooth bitmap

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

Android:在画布上测量文本高度

我目前正致力于渲染Bitmap,然后我想将其发送到移动打印机.但是,我正在努力测量文本的高度,所以我可以适当地提升y位置.

我的基本位图/画布/绘画配置是这样的(字体大小是16,位图的尺寸是200x400(宽x高)):

public MyRenderer() {
    // Initialize bitmap
    bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888);

    // Initialize canvas
    canvas = new Canvas(bitmap);

    // Initialize brush (Paint instance)
    brush = new Paint();
    brush.setTextSize(16);
    brush.setTypeface(Typeface.SANS_SERIF);
    brush.setColor(Color.BLACK);
    brush.setStyle(Paint.Style.FILL);
    brush.setAntiAlias(true);
    brush.setTextAlign(Align.LEFT);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好,现在我想做的是:如果我使用Paint的方法drawText,我需要提供x和y坐标.至于x为零(假设左对齐文本)但是对于y,我必须计算我打印的每个文本的高度并将其加起来,这样我就可以跟踪我当前的y位置.

这是奇怪的地方:我使用以下方法来确定文本的高度(使用我先前初始化的Paint对象 - 它被称为"brush"):

public int measureHeight(String text) {
    Rect result = new Rect();
    // Measure the text rectangle to get the height
    brush.getTextBounds(text, 0, text.length(), result);
    return result.height();
}
Run Code Online (Sandbox Code Playgroud)

上述方法为以下文本返回以下值:

  1. " Hello World "返回12的高度
  2. " 相机实例可用于计算3D变换并生成矩阵. "返回高度为16
  3. " Android设计简介:了解创建世界级Android用户界面的原则,构建模块和模式的地方.无论您是UI专业人士还是扮演该角色的开发人员,这些文档都会向您展示如何做出良好的设计决策,无论大小. "返回 …

android paint android-canvas

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

内存泄漏通过IClipboardDataPasteEventImpl

我注意到我的一个活动内存增加了奇怪.因此我进行了一些测试:我多次打开对话框(打开 - 关闭 - 打开 - 关闭....)并且内存不断增加.所以我使用DDMS转储HPROF文件并在MAT(Memory analyzer)中打开它.漏洞可疑报告指出,内存消耗增长的主要原因是:

在此输入图像描述

所以我做了一个直方图,检查我运行测试的对话框是什么让它保持活力.事实证明,它通过它的AutoCompleteTextViews保持活跃,而后者又由android.widget.TextView $ IClipboardDataPasteEventImpl保持活着.但是IClipboardDataPasteEventImpl没有直接的支配者(GC当然除外).我试图在互联网上找到IClipboardDataPasteEventImpl并且我搜索了grepcode(android源码),但我唯一想到的就是这个博客条目.我无法阅读任何语言,但我能读到的是投入的英文单词,这表明它可能是三星Galaxy SII(我正在使用的手机,运行android 2.3.x)上的一个错误,与ClipboardManager相关.但是我不确定这个(我想解决这个问题,因此我不愿意接受它只是一个无法修复的错误)而且我不知道这个剪贴板产生的原因和原因.我非常感谢有关此事的任何指示/想法.

android memory-leaks android-ui

8
推荐指数
2
解决办法
3989
查看次数