有没有办法判断是否在Kotlin中初始化了懒惰的val而没有在此过程中初始化它?
例如,如果我有一个懒惰的val,查询它是否为null将实例化它
val messageBroker: MessageBroker by lazy { MessageBroker() }
if (messageBroker == null) {
// oops
}
Run Code Online (Sandbox Code Playgroud)
我可能会使用第二个变量,但这看起来很混乱.
private var isMessageBrokerInstantiated: Boolean = false
val messageBroker: MessageBroker by lazy {
isMessageBrokerInstantiated = true
MessageBroker()
}
...
if (!isMessageBrokerInstantiated) {
// use case
}
Run Code Online (Sandbox Code Playgroud)
是否有一些性感的方式来确定这一点,比如if (Lazy(messageBroker).isInstantiated())?
相关(但不相同):如何检查"lateinit"变量是否已初始化?
我刚刚提交了一个Java作业,我需要在屏幕上随机绘制一些圆圈作为游戏的一部分.给我们的挑战之一是确保没有任何圆圈重叠.我最终采用了一种奇怪的方法(因为我想:D)基本上只是使用trig从屏幕中心创建了一个模式,这很有趣.虽然这种方法中的圆圈从不重叠,但它并不理想......圆圈的分布在屏幕中间相当紧凑,角落中使用的空间非常小.
我还创建了一个(注释掉的)蛮力方法,如果拟议的圆的x,y坐标与已经创建的圆相交,则简单地重新滚动新坐标,虽然理论上能够循环到无限,但最有可能不会超过十个交叉点.
在与朋友讨论解决方案后(以及谷歌搜索引擎优化)后,我们真的非常有兴趣看看如何在没有蛮力的情况下完成这项工作.要求:
可能,使用标准库?
有没有办法WindowInsets在活动创建之后很长时间内获取活动,而无需坚持或以其他方式缓存它?
例如.
WindowInsets insets = getWindow().getWindowInsets();
myUseCaseView.setPaddingTop(insets.getSystemWindowInsetTop);
Run Code Online (Sandbox Code Playgroud) 使用Android架构的导航组件,我有以下导航图
-> [Home] -> [Articles List] -> [Specific Article]
我也有一个深层链接[Specific Article].当它打开时,当前导航到[Home].
我想合成一个背板,这样导航就可以回到[Articles List]([Home]如果再次导航的话).
这样做的导航方式是什么?
android android-architecture-components android-architecture-navigation
在一个任务中,没有任何互联网连接,我正在创建一个ParseObject并引用另一个ParseObject和当前用户.然后我将其固定到本地数据存储区,以便稍后保存(这些类和数据存储区已正确初始化).
final Rating rating = new Rating(substationObjectId, data);
// inside constructor
put(KEY_OTHER_OBJECT, OtherObject.createWithoutData(OtherObject.class, substationObjectId));
put(KEY_USER, ParseUser.getCurrentUser());
rating.pin("unsent");
Run Code Online (Sandbox Code Playgroud)
我通过快速查询来跟进此操作,以从该引脚获取所有评级.
final ParseQuery<Rating> queryUnsent = ParseQuery.getQuery(Rating.class);
queryUnsent.whereEqualTo(Rating.KEY_USER, ParseUser.getCurrentUser());
queryUnsent.fromPin("unsent");
final List<Rating> unsentRatings = queryUnsent.find();
Logger.d(LOG_TAG, "queryUnsent count = %d", unsentRatings.size());
for (Rating unsentRating: unsentRatings) {
Logger.d(LOG_TAG, "\tdatastore for %s with objectId='%s'", unsentRating().getName(), unsentRating.getObjectId());
}
Run Code Online (Sandbox Code Playgroud)
问题:只有一个评级似乎固定.即使解析报告成功,也不会存储第二个评级.
对于'Albury'的评级的第一个固定(null objectId是正确的和预期的)在针对该引脚的后续get-all查询中产生这些:
queryUnsent count = 1
datastore for Albury with objectId='null'
Run Code Online (Sandbox Code Playgroud)
第二个'Arapuni':
queryUnsent count = 1
datastore for Albany with objectId='null'
Run Code Online (Sandbox Code Playgroud)
其他事情尝试过:
Android O通过支持库将xml中的字体引入API 16.但是我无法找到相应的支持TypedArray.getFont(),这需要API级别26.
val array = context.obtainStyledAttributes(styleResId, R.styleable.TextAppearance)
val font = array.getFont(R.styleable.TextAppearance_android_fontFamily) // nope
Run Code Online (Sandbox Code Playgroud)
是否有某种compat实用程序类可用于从样式资源ID中检索字体?
我一直在VS2012教自己C++,并且遇到了一些真正让我摸不着头脑的东西.当创建一个对象并在另一个对象中添加对它的引用时,该对象似乎被破坏或者某些东西.它不是 null(空指针检查的每个组合我可以确认这一点),但其内容很时髦并且试图访问其中一个成员导致"0xC0000005:访问冲突读取位置0xCCCCCCE8".

我的程序的要点是我有一个Tile对象的2D矢量,每个对象都可以引用一个站点.当我在具有网站的tile的draw()函数中时,它将尝试以其文明所属的颜色绘制该网站.
世界一代:
std::vector<std::vector<Tile>> world;
// ... vector is sized ...
// Populate world with tiles
for (int h=0; h<height; h++) {
for (int w=0; w<width; w++) {
Tile t(PLAINS);
world[h][w] = t;
}
}
Run Code Online (Sandbox Code Playgroud)
创建文明时,会为它们创建一个简单的大写网站,并将其引用放在指定x,y的图块中:
void Game::createCivilisation(std::string name, sf::Color colour, int x, int y) {
// Create the civ
Civilisation civ(name, colour);
// Create their capital and link it up
Site capital("Capital", year, &civ); // when I comment these five lines out
civ.capital = &capital; // the …Run Code Online (Sandbox Code Playgroud) 使用cocos2d-x 3.x为设备开发时,它会自动设置GL视图以适合设备.在VS2012的Windows上,它创建了一个看似任意大小的窗口.如何设置该窗口的大小?
我正在编写一个新的 Kotlin 库模块来添加常用的类和扩展方法。我正在使用以下命令将每个扩展文件(例如 BitmapExtensions.kt)编译成一个名为“Extensions”的文件JvmMultifileClass:
@file:JvmName("Extensions")
@file:JvmMultifileClass
fun Bitmap.crop(cropRect: Rect) = ...
Run Code Online (Sandbox Code Playgroud)
作为我们公司 IP 政策的一部分,我需要在库进入任何消费者项目之前通过 proguard对其进行混淆。因此,我需要一个 proguard 规则来保留这些扩展方法,以免它们被丢弃。
乍一看,下面似乎可行,检查生成的 AAR 的 classes.jar 表明扩展方法仍然存在,并且它们的内部结构已被混淆。但是在消费者项目中实际编译时,我得到了对我所引用的任何扩展方法的未解析引用。
-keepclassmembernames class mycompany.kotlin.util.Extensions {
<methods>;
}
Run Code Online (Sandbox Code Playgroud)
当我禁用缩小时,项目构建正确。
如何混淆我的库并保留我的 kotlin 扩展?
编辑:似乎keep在整个包上使用,甚至指定-dontshrink是不够的。这些方法根本无法在消费者应用程序中引用。
edit2:我相信我已经将范围缩小到.kotlin_module/META-INF/ 下的文件在minifyEnabled=true. 这似乎是我的缩小和非缩小 classes.jar 之间的唯一区别。有些东西正在删除这个文件......或阻止它的生成。
对于地球各种表面上的人们来说,清晨.
问题:如何从箭头键获取方向角.
序言:在基本的自上而下游戏中移动的标准方法是在更新方法中添加到x和/或y,具体取决于方向.
if (moveUp) playerY -= delta * speed;
if (moveDown) playerY += delta * speed;
if (moveLeft) playerX -= delta * speed;
if (moveRight) playerX += delta * speed;
Run Code Online (Sandbox Code Playgroud)
这对于4向运动来说是优雅的(我相信),因为无论按下哪种按键组合,运动方向都是一致的.例如,向上 - 向下按下将向左移动,因为上下取消.但是当沿对角线移动时,步数会太大.如果速度为20,向左移动将向左移动每秒20,向上移动将每秒向上移动20.但向左上移动将略微超过每秒28.24.
这里的解决方案是使用cos和sin来获取新的x和y,一旦你知道角度就很容易:
playerX += Math.cos(Math.toRadians(angle)) * delta * speed;
playerY -= Math.sin(Math.toRadians(angle)) * delta * speed; //y is inverted
Run Code Online (Sandbox Code Playgroud)
但是,至少对我来说,这提出了一个新问题:角度是什么?在我的KeyListener中,我正在为每个箭头键设置/清除布尔值.我可以使用一组庞大的if语句:
if (moveUp) angle = 90;
if (moveDown) angle = 270;
if (moveRight) angle = 0;
if (moveLeft) angle = 180;
if (moveUp && moveLeft) angle = 135; …Run Code Online (Sandbox Code Playgroud) 针对可穿戴设备的Android 5.1.1引入了通过旋转/轻弹手腕来消除通知的功能.此API是否公开供开发人员使用?我无法找到任何相关信息,他们的可穿戴设备开发者网站似乎没有更新.
简短而甜蜜:关于EditText ,我不知道textVisiblePassword和之间有什么区别。根据文档,是“应该可见的密码文本”,其中密码是无用的“密码文本”。 textinputTypetextVisiblePassword
有什么不同?为什么要使用 textVisiblePassword?
android ×7
java ×2
kotlin ×2
android-architecture-components ×1
android-architecture-navigation ×1
c++ ×1
cocos2d-x ×1
wear-os ×1
windows ×1