小编Tom*_*Tom的帖子

Kotlin:检查lazy val是否已初始化

有没有办法判断是否在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"变量是否已初始化?

kotlin

32
推荐指数
3
解决办法
7077
查看次数

放置随机圆圈而不重叠(并且不使用强力)?

我刚刚提交了一个Java作业,我需要在屏幕上随机绘制一些圆圈作为游戏的一部分.给我们的挑战之一是确保没有任何圆圈重叠.我最终采用了一种奇怪的方法(因为我想:D)基本上只是使用trig从屏幕中心创建了一个模式,这很有趣.虽然这种方法中的圆圈从不重叠,但它并不理想......圆圈的分布在屏幕中间相当紧凑,角落中使用的空间非常小.

我还创建了一个(注释掉的)蛮力方法,如果拟议的圆的x,y坐标与已经创建的圆相交,则简单地重新滚动新坐标,虽然理论上能够循环到无限,但最有可能不会超过十个交叉点.

在与朋友讨论解决方案后(以及谷歌搜索引擎优化)后,我们真的非常有兴趣看看如何在没有蛮力的情况下完成这项工作.要求:

  • 在640x480窗口上绘制20个半径为十个单位的圆
  • 绝对没有圆圈重叠
  • 否则在屏幕上随机分布

可能,使用标准库?

java

17
推荐指数
1
解决办法
4031
查看次数

派遣后有没有办法获得现有的窗口插件?

有没有办法WindowInsets在活动创建之后很长时间内获取活动,而无需坚持或以其他方式缓存它?

例如.

WindowInsets insets = getWindow().getWindowInsets();
myUseCaseView.setPaddingTop(insets.getSystemWindowInsetTop);
Run Code Online (Sandbox Code Playgroud)

android

13
推荐指数
1
解决办法
971
查看次数

Android导航库深层链接:如何合成backstack

使用Android架构的导航组件,我有以下导航图

-> [Home] -> [Articles List] -> [Specific Article]

我也有一个深层链接[Specific Article].当它打开时,当前导航到[Home].

我想合成一个背板,这样导航就可以回到[Articles List]([Home]如果再次导航的话).

这样做的导航方式是什么?

android android-architecture-components android-architecture-navigation

10
推荐指数
1
解决办法
1772
查看次数

parse.com数据存储区不会固定多个未保存的对象

在一个任务中,没有任何互联网连接,我正在创建一个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)

其他事情尝试过:

  • pinEventually( "未发送")
  • pin()没有标签
  • 之后立即保存()并丢弃连接异常
  • 从任何地方删除user = …

android parse-platform

9
推荐指数
1
解决办法
470
查看次数

在API 26之前从TypedArray获取字体资源

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中检索字体?

android

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

C++ Object不为null,但其内容是否被破坏?

我一直在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)

c++

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

Windows上的cocos2d-x 3.x:如何更改游戏窗口的大小?

使用cocos2d-x 3.x为设备开发时,它会自动设置GL视图以适合设备.在VS2012的Windows上,它创建了一个看似任意大小的窗口.如何设置该窗口的大小?

windows visual-studio cocos2d-x cocos2d-x-3.0

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

带有 proguard 的 Kotlin AAR 库:如何保留扩展方法?

我正在编写一个新的 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 之间的唯一区别。有些东西正在删除这个文件......或阻止它的生成。

android kotlin

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

所有方向的8向一致移动速度,如何从方向键获得移动角度?

对于地球各种表面上的人们来说,清晨.

问题:如何从箭头键获取方向角.

序言:在基本的自上而下游戏中移动的标准方法是在更新方法中添加到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)

java

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

Android Wear 5.1腕式手势API?

针对可穿戴设备的Android 5.1.1引入了通过旋转/轻弹手腕来消除通知的功能.此API是否公开供开发人员使用?我无法找到任何相关信息,他们的可穿戴设备开发者网站似乎没有更新.

android wear-os

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

输入类型“textVisiblePassword”与“text”:有什么区别?

简短而甜蜜:关于EditText ,我不知道textVisiblePassword和之间有什么区别。根据文档,是“应该可见的密码文本”,其中密码是无用的“密码文本”。 textinputTypetextVisiblePassword

有什么不同?为什么要使用 textVisiblePassword?

android

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