这一定是个愚蠢的问题,但我对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)
但我得到一个警告:"财产必须初始化或是抽象的"
我必须在每个项目中创建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
我正在使用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) 我正在尝试使用绑定字符串数组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重新编写到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)
一切都很好.
我正在尝试为我的模型编写序列化程序,这些序列化程序是从一些基类继承的,但我得到了属性错误.我将不胜感激任何帮助.
基类:
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
在我的项目中,我需要处理不同线程中的对象.为了操纵流的行为,我创建了新的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转换为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) 我是全新的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) 简短:
这可能是一个不是孩子的班级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?
任何帮助,将不胜感激.
我决定为 Android 编写自定义 lint 检查,并且我对 Android Lint 有很强的信心,所以我不想使用detekt或ktlint检查代码(它们不能解析 xml 文件等,我想使用单个工具)。
但是当我阅读 Android Lint 的文档时,我发现他们有这个新的UAST和PSI(com.intellij.psi包)的东西,当detekt使用它的孩子时(仅限 kotlin org.jetbrains.kotlin.psi)。
我的项目中没有 java 代码,我想编写 kotlin 特定的 lint 规则。
我明白了,它com.android.tools.lint.detector.api.Detector有一个createPsiVisitor返回的方法JavaElementVisitor,这JavaElementVisitor是com.intellij.psi.PsiElementVisitor. 有没有可能,可以org.jetbrains.kotlin.psi.KtVisitor代替使用?
或者我如何编写 kotlin 特定的检查 Detector.UastScanner?
我想(例如)为
PS我成功地做到了这一点 detekt,但我想使用默认的 Android Lint。
[UPD]
我发现了com.android.tools.lint.checks.InteroperabilityDetector。可能会写一些KotlinVisitor(就像JavaVisitor在这个类中一样)。这KotlinVisitor将只是包装KtVisitor?
我必须存储巨大的布尔值列表,我选择将它们存储为字节数组作为字符串。但我不明白,为什么转换为字符串并返回会产生不同的字符串值:
支持方式:
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 …
android ×9
java ×9
kotlin ×5
rx-java ×3
retrofit ×2
annotations ×1
arrays ×1
butterknife ×1
byte ×1
collections ×1
dagger-2 ×1
django ×1
lint ×1
python ×1
rx-android ×1
utf-8 ×1
xml ×1