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) 在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!它应该是相机如何坐在设备中的物理属性,对吧?
CameraInfo.orientation?在文档中是否有证据证明这是合法行为,或者它可能是设备中的错误?我想将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)
但是 - 我不确定一些事情:
这种方法有意义吗?有没有更简单的方法?仅仅将位图设置为黑白是不够的,主要问题是将每个像素的颜色信息减少为一位.
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) 我正在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.
我目前正在尝试将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) 我想做的事:
使用嵌入在TextInputLayout中的EditText时我想...
我尝试过的:
在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的设置?
假设用户已将一些文本写入EditText,然后触摸屏幕上的其他位置,这会导致光标位置发生变化:如何确定新的光标位置?
我想打印到Bixolon SPP-R200,就像我听说的那样,它是用android设置的更容易的移动蓝牙打印机之一.但是我不知道如何开始.
我想首先我必须通过蓝牙连接到打印机 - 为此我假设我采用原生的Android蓝牙API?
我可能需要某种SDK来向打印机发送数据 - 我在这里读到,有一个SDK,但浏览bixolon页面并没有产生任何结果(即没有SDK) - 我写信支持,但我是不要期待很快回答......
我想我还有其他问题(例如:你在.Net CF中可以将位图发送到打印机吗?)与该打印机的SDK紧密相关 - 如果它存在的话......
我目前正致力于渲染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)
上述方法为以下文本返回以下值:
我注意到我的一个活动内存增加了奇怪.因此我进行了一些测试:我多次打开对话框(打开 - 关闭 - 打开 - 关闭....)并且内存不断增加.所以我使用DDMS转储HPROF文件并在MAT(Memory analyzer)中打开它.漏洞可疑报告指出,内存消耗增长的主要原因是:

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