小编Ant*_*nko的帖子

财产必须初始化或是抽象的

这一定是个愚蠢的问题,但我对Kotlin来说真的很新,我找不到任何解决方案.

如何声明类字段?就像我们可以在java中一样:

protected SharedPreferences mSharedPreferences;
Run Code Online (Sandbox Code Playgroud)

后来在onCreate():

mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
Run Code Online (Sandbox Code Playgroud)

现在我可以在任何我想要的地方使用它(在这个基本活动的子类中).

我试着在Kotlin做同样的事情:

protected var sharedPreferences : SharedPreferences
Run Code Online (Sandbox Code Playgroud)

并在onCreate():

sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
Run Code Online (Sandbox Code Playgroud)

但我得到一个警告:"财产必须初始化或是抽象的"

android kotlin

103
推荐指数
2
解决办法
3万
查看次数

使用水平滚动嵌套的RecyclerView中的滚动行为

我必须在每个项目中创建RecyclerView具有嵌套水平的垂直RecyclerView.一切都在CoordinatorLayout.当我通过点击外部嵌套的RecyclerView工具栏隐藏滚动时,但当我通过点击嵌套的一个工具栏滚动父回收器时保持.

任何帮助,将不胜感激.

这是我的xml布局:

main_activity.xml:

<android.support.design.widget.CoordinatorLayout 
   ...>

<FrameLayout
    android:id="@+id/fragment_frame"
    ...
    android:fitsSystemWindows="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

<android.support.design.widget.AppBarLayout
    ...
    android:fitsSystemWindows="true"
    android:id="@+id/appbar_layout">

        <include layout="@layout/toolbar"/>

</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

这是toolbar.xml:

<android.support.v7.widget.Toolbar
    android:id="@+id/main_toolbar"
    ...
    android:fitsSystemWindows="true"
    app:layout_scrollFlags="scroll|enterAlways">

    <TextView .../>

</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)

fragment.xml之:

<android.support.v7.widget.RecyclerView
    ...
    android:scrollbars="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
Run Code Online (Sandbox Code Playgroud)

而recycleler_view_item.xml:

<RelativeLayout ...>

    <TextView .../>

    <!-- fixme(CullyCross) fix bug with hiding toolbar -->
    <android.support.v7.widget.RecyclerView
        ...
        android:scrollbars="horizontal"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />

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

谢谢,
安东

xml android material-design android-toolbar android-coordinatorlayout

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

Observable.empty()导致java.util.NoSuchElementException:Sequence不包含任何元素

我正在使用Retrofit 2.0.0-beta2和RxJava 1.0.14.我以这种方式处理错误,因为我需要在doFinally中执行一些代码:

.onErrorResumeNext(Observable.empty());

但是当我得到带有错误的http响应时(例如401),我的应用程序崩溃,堆栈跟踪中没有我的类.什么也没有发生,如果使用Observable.never.这是完整的堆栈跟踪:

java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
at rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:60)
at android.os.Handler.handleCallback (Handler.java:739)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:135)
at android.app.ActivityThread.main (ActivityThread.java:5221)
at java.lang.reflect.Method.invoke (Unknown source)
at java.lang.reflect.Method.invoke (Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)

rx.exceptions.OnErrorNotImplementedException: Sequence contains no elements
at rx.Observable$27.onError (Observable.java:7535)
at rx.observers.SafeSubscriber._onError (SafeSubscriber.java:154)
at rx.observers.SafeSubscriber.onError (SafeSubscriber.java:111)
at rx.internal.operators.OperatorDoOnEach$1.onError (OperatorDoOnEach.java:70)
at rx.internal.operators.OperatorDoOnEach$1.onError (OperatorDoOnEach.java:70)
at rx.internal.operators.OperatorDoOnEach$1.onError (OperatorDoOnEach.java:70)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue (OperatorObserveOn.java:197)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call (OperatorObserveOn.java:170)
at rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:55)
at android.os.Handler.handleCallback (Handler.java:739)
at …
Run Code Online (Sandbox Code Playgroud)

java android nosuchelementexception rx-java retrofit

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

在奶油刀中绑定一串字符串

我正在尝试使用绑定字符串数组butterknife.但似乎没有办法(但在处理器中有一种绑定数组的方法).

这是我的代码:

strings.xml中

<string-array name="test_strings">
    <item>VK</item>
    <item>Facebook</item>
    <item>Twitter</item>
    <item>Instagram</item>
    <item>Google plus</item>
    <item>Google mail</item>
</string-array>
Run Code Online (Sandbox Code Playgroud)

主要活动

@Bind(R.string.test_strings)
protected String [] mStrings;
Run Code Online (Sandbox Code Playgroud)

java arrays android annotations butterknife

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

在Kotlin中使用lambdas的匿名类

我正在尝试将我的休闲时间项目从Java重新编写到Kotlin(理解它),我遇到了一些问题.研究给我带来了{ function() }但它并没有帮助我

在Java中我有这个界面:

public interface Shuffling<T> {

  List<T> shuffle(List<T> list, ShuffleCallback callback);

  interface ShuffleCallback {
    void onShuffle(int addedTo, int randomIndex);
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将测试对象添加到Kotlin中的洗牌算法列表中:

val algoList = ArrayList<Shuffling<Int>>()
algoList.add(Shuffling { list, callback -> {
    Timber.d("Test!")
    ArrayList<Int>() // how to return this value?
}})
Run Code Online (Sandbox Code Playgroud)

第一个麻烦

如何在lambda函数中添加多行?

另外我还有一个麻烦的例子:

Kotlin界面:

interface Drawable {
    fun draw()
}
Run Code Online (Sandbox Code Playgroud)

和Kotlin实施:

private val drawList = ArrayList<Drawable>()

//...
drawList.add(Drawable {glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)})
Run Code Online (Sandbox Code Playgroud)

第二个麻烦

以前我只用过:

mDrawList.add(() -> glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices));
Run Code Online (Sandbox Code Playgroud)

一切都很好.

java kotlin

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

属性错误Django REST序列化

我正在尝试为我的模型编写序列化程序,这些序列化程序是从一些基类继承的,但我得到了属性错误.我将不胜感激任何帮助.

基类:

class AbstractTranslationModel(models.Model):
    class Meta:
        abstract = True

    language = models.CharField(max_length=2, choices=LANGUAGES)

    # Translatable fields
    name = models.CharField(max_length=22)
    description = models.TextField(default='')

    def __str__(self):
        return self.name + ' ' + str(self.language)
Run Code Online (Sandbox Code Playgroud)

子类:

class SkillTranslation(AbstractTranslationModel):

    class Meta:
        unique_together = (('translation_of', 'language'), )

    # Foreign keys
    translation_of = models.ForeignKey(Skill, related_name='translations',
                                       related_query_name='translation')
Run Code Online (Sandbox Code Playgroud)

这是这个类的序列化器:

class SkillTrSerializer(serializers.ModelSerializer):
    class Meta:
        model = SkillTranslation
        fields = ('language', 'name', 'description', )
Run Code Online (Sandbox Code Playgroud)

这里是一个类的序列化器,包含那些:

class SkillSerializer(serializers.ModelSerializer):
    translations = SkillTrSerializer()

    class Meta:
        model = Skill
        fields = ('translations', )
Run Code Online (Sandbox Code Playgroud)

这是控制台输出:

>>> …
Run Code Online (Sandbox Code Playgroud)

python django serialization attributeerror django-rest-framework

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

操作线程RxJava的有效方法

在我的项目中,我需要处理不同线程中的对象.为了操纵流的行为,我创建了新的observable来改变它们的observeOn()方式:

apiService.getObjects(token) // Retrofit
                .compose(bindToLifecycle())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(o -> {
                    // process in Main Thread
                })
                .map(Observable::just)  // create new one, to change thread for it
                .observeOn(Schedulers.io()) 
                .subscribe(o -> {
                    // process in the background thread
                });
Run Code Online (Sandbox Code Playgroud)

但我认为在RxJava中有更多美观有效的方法来处理不同线程中的一个响应.我试着谷歌,但我没有找到任何东西.

谢谢,
安东

java multithreading android rx-java

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

Kotlin androidTest:测试已完成。空测试套件

我正在尝试将测试从Java转换为Kotlin。

简单的单元测试已成功翻译,如下所示:

class BindingUtilsTest {
  @Test @Throws(Exception::class)
  fun testConvertBooleanToVisibility_visible() {
    assertEquals(BindingUtils.convertBooleanToVisibility(true), View.VISIBLE)
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行androidTest时,它失败并显示以下消息:“未找到测试”,并且

测试运行已开始
测试已完成。

空的测试套件。

在使用Java时,代码可以完美运行。相关代码:

build.gradle部分:

apply plugin: "com.android.application"
apply plugin: "com.neenbedankt.android-apt"

// for tests
apply plugin: 'kotlin-android'


// defaultConfig
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

sourceSets {
    test.java.srcDirs += 'src/test/kotlin' // tests are there
    androidTest.java.srcDirs += 'src/androidTest/kotlin' // and there
}

// unit tests
testApt "com.google.dagger:dagger-compiler:${daggerVer}"

// kotlin
testCompile "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVer}"
testCompile "org.jetbrains.kotlin:kotlin-test-junit:${kotlinVer}"

// android tests

androidTestApt "com.google.dagger:dagger-compiler:${daggerVer}"

// kotlin
androidTestCompile "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVer}"
androidTestCompile "org.jetbrains.kotlin:kotlin-test-junit:${kotlinVer}"
Run Code Online (Sandbox Code Playgroud)

简单测试:

@RunWith(AndroidJUnit4::class) class MainDrawerActivityTest {

  private …
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-testing dagger-2

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

RxJava将一个Observable拆分为两个subObservable

我是全新的RxJava,我花了一整天时间来理解它,我想要考虑如何解决这个问题:

我有一个对象,Retrofit它包含两个ArrayLists,我必须以不同的方式处理每个ArrayList.目前它看起来像:

apiService.getUser(token).enqueue(new Callback<User>() {
            @Override
            public void onResponse(Response<User> response) {

                final User user = response.body();

                for (Skill s : user.getSkills()) {
                    // process here first ArrayList
                }

                for (OrganizerAction o : user.getOrganizerActions()) {
                    // process here second ArrayList
                }
            }

            @Override
            public void onFailure(Throwable t) {
                t.printStackTrace();
            }
        });
Run Code Online (Sandbox Code Playgroud)

更新:

public class User {

    // fields

    @SerializedName("organizer_actions")
    @Expose
    private List<OrganizerAction> mOrganizerActions;

    @SerializedName("skills")
    @Expose
    private List<Skill> mSkills;

    public List<OrganizerAction> getOrganizerActions() {
        return mOrganizerActions;
    } …
Run Code Online (Sandbox Code Playgroud)

java android rx-java retrofit rx-android

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

'List <T>'可能不包含'Object'类型的类型对象

简短:
这可能是一个不是孩子的班级Object吗?

Long:
我正在使用List<T>包含interface(Operation)的实现:

public class OperationQueue<T extends Operation> {

    private final List<T> mQueue = new ArrayList<>();
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我在循环中浏览此列表时,我将每个已完成的操作标记为null,因为我必须保持相同的大小并且我不能使用iterator(它抛出ConcurrentModificationException):

for (int i = 0; i < mQueue.size() && !mState.equals(State.PAUSED); i++) {
    mOperation = mQueue.get(i);
    if (mOperation != null) {
        mOperation.run();
    }
    mQueue.set(i, null);
}
Run Code Online (Sandbox Code Playgroud)

当我暂停或完成队列执行时,我使用:

mQueue.removeAll(Collections.singleton(null));

Android Studio向我显示警告:

'List<T>' may not contain type objects of type 'Object'

这怎么可能?我以为一切都是孩子的Object

任何帮助,将不胜感激.

java collections android

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

仅适用于 kotlin 的自定义 Android Lint(无 Java)

我决定为 Android 编写自定义 lint 检查,并且我对 Android Lint 有很强的信心,所以我不想使用detektktlint检查代码(它们不能解析 xml 文件等,我想使用单个工具)。

但是当我阅读 Android Lint 的文档时,我发现他们有这个新的UASTPSIcom.intellij.psi包)的东西,当detekt使用它的孩子时(仅限 kotlin org.jetbrains.kotlin.psi)。

我的项目中没有 java 代码,我想编写 kotlin 特定的 lint 规则。

我明白了,它com.android.tools.lint.detector.api.Detector有一个createPsiVisitor返回的方法JavaElementVisitor,这JavaElementVisitorcom.intellij.psi.PsiElementVisitor. 有没有可能,可以org.jetbrains.kotlin.psi.KtVisitor代替使用?

或者我如何编写 kotlin 特定的检查 Detector.UastScanner

我想(例如)为

科特林隐藏费用设定的物品(123

PS我成功地做到了这一点 detekt,但我想使用默认的 Android Lint。

[UPD] 我发现了com.android.tools.lint.checks.InteroperabilityDetector。可能会写一些KotlinVisitor(就像JavaVisitor在这个类中一样)。这KotlinVisitor将只是包装KtVisitor

java android lint kotlin

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

完整的软件包名称,而不是Android Studio中的文件夹

固定于2.2.1


在将Android Studio更新到2.2之后,我遇到了这个问题。很难在13英寸的小型显示器上使用这种格式。

在项目视图和Android视图中,我将文件夹名称作为完整的软件包名称,但是我只想查看目录名称: 项目窗口的屏幕截图

我试图搜索此问题,但只找到“压缩空中间包”,它仅对顶级文件夹有影响。

“扁平包”选项会创建大量目录,每个包都会使所有事情变得更糟:

展平包装

一张截图:

带有设置屏幕

intellij-idea android-studio android-studio-2.2

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

将 ByteArray 转换为字符串并返回会产生不同的字符串

我必须存储巨大的布尔值列表,我选择将它们存储为字节数组作为字符串。但我不明白,为什么转换为字符串并返回会产生不同的字符串值:

支持方式:

  fun ByteArray.string(): String {

    var str = ""

    this.reversed().forEach {
      str += intToString(it, 4)
    }

    return str
  }

  fun intToString(number: Byte, groupSize: Int): String {
    val result = StringBuilder()

    for (i in 7 downTo 0) {
      val mask = 1 shl i
      result.append(if (number.toInt() and mask != 0) "1" else "0")

      if (i % groupSize == 0)
        result.append(" ")
    }
    result.replace(result.length - 1, result.length, "")

    return result.toString()
  }
Run Code Online (Sandbox Code Playgroud)

第一个例子:

给定选定的索引 [0, 14],我的代码转换为:作为字节:[1, 64]。.string()产生:

0100 0000 0000 …

java byte utf-8 character-encoding kotlin

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