根据Android文档,Spinner小部件支持Material Design样式.
所以我决定在我的应用程序中使用它将它放在工具栏的顶部.
布局/ activity_base.xml
<android.support.v7.widget.Toolbar
android:id="@+id/my_awesome_toolbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="5dp"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)
活动主题
<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/omni_primary_color</item>
<item name="colorPrimaryDark">@color/omni_primary_color_dark</item>
<item name="colorAccent">@color/omni_accent_color</item>
</style>
Run Code Online (Sandbox Code Playgroud)
BaseActivity.java
public class BaseActivity extends ActionBarActivity {
@InjectView(R.id.my_awesome_toolbar)
Toolbar mToolbar;
@InjectView(R.id.spinner)
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
ButterKnife.inject(this);
//setup toolbar
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
mToolbar.setNavigationIcon(R.drawable.ic_action_navigation_menu);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(mToolbar.getContext(),
R.array.planets_array, R.layout.support_simple_spinner_dropdown_item);
adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
}
}
Run Code Online (Sandbox Code Playgroud)
在棒棒糖旋转器和下拉列表看起来很好,虽然下拉背景颜色是黑色比菜单下拉列表是白色.我猜这app:popupTheme="@style/ThemeOverlay.AppCompat.Light"不会传播到微调器.
Android 5.0

现在最大的问题是Android 4.x下拉背景颜色是白色(popupTheme传播?)和微调器旁边的图标是黑色.
Android 4.4

我将开始在我的Android项目中使用反应式编程.我使用Kotlin作为主要语言,现在我想申请Rx.我的第一选择是RxAndroid,但后来我注意到有RxKotlin.
据我所知,两者都是从RxJava分叉的,所以RxAndroid可能为android常见任务提供了一些API.另一方面,RxKotlin支持lambas开箱即用,让我避免将kotlin与java混合.
在这种情况下哪一个是首选的库?
我想设置背景颜色或null使用DataBinding库在我的视图上,但我尝试运行它时遇到异常.
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
Run Code Online (Sandbox Code Playgroud)
我是这样做的:
android:background="@{article.sponsored ? @color/sponsored_article_background : null}"
Run Code Online (Sandbox Code Playgroud)
我也试过设置转换但它没有用.
@BindingConversion
public static ColorDrawable convertColorToDrawable(int color) {
return new ColorDrawable(color);
}
Run Code Online (Sandbox Code Playgroud)
最后,我使用解决方法解决了它,@BindingAdapter但我想知道如何正确地做到这一点.
最近我@Named在Kotlin 遇到了资格赛问题.我以为从这个改变:
var boldTypeface: Typeface? = null
[Inject] set
Run Code Online (Sandbox Code Playgroud)
进入这个
var boldTypeface: Typeface? = null
[Inject Named("bold")] set
Run Code Online (Sandbox Code Playgroud)
要么
var boldTypeface: Typeface? = null
[Inject] [Named("bold")] set
Run Code Online (Sandbox Code Playgroud)
会解决我的问题.但它没有,它甚至没有编译.
我有RecyclerView各种视图类型.每个视图都有自己的背景,顶部,底部或没有圆角.每个使用相同的视图高程.这是XML的背景之一
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:color="@color/card_background_pressed"
tools:targetApi="lollipop">
<item>
<shape>
<size
android:width="1dp"
android:height="1dp" />
<solid android:color="@color/card_background_normal" />
</shape>
</item>
</ripple>
Run Code Online (Sandbox Code Playgroud)
当视图彼此相邻而没有任何边距时,它看起来像具有相同的背景.这是我创建动态卡背景的方式.换句话说,我可以从多个项目创建单看卡片RecyclerView
问题
如下所示,当两个视图彼此相邻布置时,即使角背景半径为0,它们的阴影也会在角落中相互重叠.
那么有谁知道如何解决它?我只关心API 21+,所以需要担心旧版本的支持.提前致谢!
我想在我的Android项目中使用Dagger 2,我在Kotlin中进行编码.我从Dagger 2 repo android-simple中举了一个例子.我已经设法使用dagger-android-gradle-sample中的示例在Android Studio中正确配置项目,它包含正确配置的gradle文件.
现在我开始将java类更改为kotlin.这是自动转换DemoApplication.java在kotlin中的样子:
public class DemoApplication : Application() {
Singleton
Component(modules = array(javaClass<AndroidModule>()))
trait ApplicationComponent {
public fun inject(application: DemoApplication)
public fun inject(homeActivity: HomeActivity)
public fun inject(demoActivity: DemoActivity)
}
public var component: ApplicationComponent? = null
override fun onCreate() {
super.onCreate()
component = `Dagger_DemoApplication$ApplicationComponent`.builder().androidModule(AndroidModule(this)).build()
component!!.inject(this)
}
}
Run Code Online (Sandbox Code Playgroud)
Dagger生成的类在Kotlin中可见,但它抱怨类名中使用的($)符号.Kotlin的($)有特殊用途,所以我猜这就是原因.您可以注意到,auto-convertion用(`)符号包装了类名,因此编辑器不会抱怨它.不幸的是,编译器失败了:
Error:(32, 21) Unresolved reference: `Dagger_DemoApplication$ApplicationComponent`
:app:compileDebugKotlin FAILED
Run Code Online (Sandbox Code Playgroud)
如果我尝试从终端构建它也有一个例外:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugKotlin'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) …Run Code Online (Sandbox Code Playgroud) 我正在建立IntentService一个后台.我收到了Kitkat设备的崩溃报告.
我的代码很简单,我不知道是什么原因.我有一个堆栈跟踪,但它没有让我到任何地方.有人经历过这样的事吗?
override fun onHandleIntent(intent: Intent?) {
if (intent != null) {
val articleIntent = intentFor<ArticleActivity>()
articleIntent.putExtras(intent)
TaskStackBuilder.create(this).addNextIntent(intentFor<DrawerActivity>()).addNextIntent(articleIntent).startActivities()
}
}
Run Code Online (Sandbox Code Playgroud)
Crashlytics的例外情况
java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1471)
at android.os.Parcel.readException(Parcel.java:1419)
at android.app.ActivityManagerProxy.startActivities(ActivityManagerNative.java:4473)
at android.app.Instrumentation.execStartActivitiesAsUser(Instrumentation.java:1496)
at android.app.ContextImpl.startActivitiesAsUser(ContextImpl.java:1417)
at android.content.ContextWrapper.startActivitiesAsUser(ContextWrapper.java:356)
at android.app.TaskStackBuilder.startActivities(TaskStackBuilder.java:221)
at android.app.TaskStackBuilder.startActivities(TaskStackBuilder.java:232)
at android.app.TaskStackBuilder.startActivities(TaskStackBuilder.java:208)
at se.omni.gcm.OpenArticleService.onHandleIntent(OpenArticleService.kt:27)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud) Google最近发布了在Android Studio中在本地JVM上运行junit的实验性支持.我想尝试一下,因为我正在使用Kotlin开发我的Android应用程序,我希望我的测试类也可以用Kotlin编写.
不幸的是,我无法让它发挥作用.我更新了我的gradle配置:
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
androidTest.java.srcDirs += 'src/androidTest/kotlin'
test.java.srcDirs += 'src/test/kotlin'//this line was added
}
testCompile 'junit:junit:4.12'
testCompile "org.mockito:mockito-core:1.9.5"
Run Code Online (Sandbox Code Playgroud)
Android Studio识别测试文件夹.
这是我的简单测试类,只是为了看它是否有效
public class MyFirstTestClass {
[Test] fun firstTest() {
println("I am OK")
Assert.assertTrue("".isEmpty())
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试运行它,我会收到以下消息
找不到类:'com.example.MyFirstTestClass'
我需要我的代码运行一个块并在 1 秒后返回值以防超时但让它完成工作。我设法实现了一些有效的东西,但 IDE 建议替换为async,withContext(DefaultDispatcher)但它的工作方式不一样。
所以我的问题是如何让它在没有 IDE 警告的情况下工作。我是 Kotlin Coroutines 的新手,所以我可能在这里遗漏了一些东西。
@Test
fun how_timeout_with_null_works() = runBlocking<Unit> {
val time = measureTimeMillis {
println("Start test")
val result = withTimeoutOrNull(1, TimeUnit.SECONDS) {
async { doSomeHardWork() }.await()
}
println("End test $result")
}
println("Time $time")
delay(3000)
}
private suspend fun doSomeHardWork(): String {
println("start hard work")
Thread.sleep(2000)
print("end hard work")
return "[hard work done]"
}
Run Code Online (Sandbox Code Playgroud)