我正在将现有应用程序从Eclipse转换为Android Studio.但是,当我在运行4.x的设备上运行它时(我在模拟器上测试了几个版本),它会立即崩溃NoClassDefFoundError.
我已经尝试评论了对它找不到的类的引用,但总会有另一个.据我所知,犯罪类总是如此
在5.0.1模拟器上一切正常(我没有要测试的设备).我的build.gradle文件相当长,但看起来像这样:
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def AAVersion = "2.7.1"
android {
compileSdkVersion 19
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "com.myapp.android"
minSdkVersion 8
targetSdkVersion 19
multiDexEnabled = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
packagingOptions {
*snip*
}
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
repositories {
maven {
url "https://repo.commonsware.com.s3.amazonaws.com"
}
}
apt { …Run Code Online (Sandbox Code Playgroud) 我正在使用媒体播放器回调方法为 Android Auto 实现语音命令。我无法让 Auto 识别出我要求在我的应用程序上播放标题:“Play [x] on MyApp”。我知道这个命令发布后需要几天时间才能工作,但我仍然可以说“Play [x]”媒体会话已经在运行,它应该使用onPrepareFromSearch和onPlayFromSearch方法来搜索和播放内容。
当我说“Play [x] on MyApp”我得到回应时“I looked for [x] on MyApp on Google Play Music but it either isn’t available or it can’t be played right now”。当我说“Play [x]”我的媒体服务正在运行时,它通常会将我重定向到 Google Play 音乐。
我可以使用语音命令暂停、恢复、向前跳和向后跳,我看到那些被记录但当我尝试执行语音搜索时既不调用onPrepareFromSearch也不onPlayFromSearch调用。
我尝试过的事情:
<intent-filter>为MEDIA_PLAY_FROM_SEARCH我的应用程序中的活动添加了一个for以标记我的应用程序可用于搜索媒体 onPrepareFromSearch并onPlayFromSearch在我的MediaSessionCompat.CallbackACTION_PLAY_FROM_SEARCH并ACTION_PREPARE_FROM_SEARCH作为支持的操作。 FLAG_HANDLES_MEDIA_BUTTONS和FLAG_HANDLES_TRANSPORT_CONTROLS我getRelativeTimeSpanString (long time, long now, long minResolution, int flags)用来计算相对日期.文档说这flags是"格式化选项的一点掩盖,例如FORMAT_NUMERIC_DATE或FORMAT_ABBREV_RELATIVE".但是,定义了大约十几个其他标志DateUtils,并且只有任何具有任何描述的标志都被弃用.
getRelativeTimeSpanString()?5d,6h和2m,但我没有看到任何东西,看起来像它这样做的.我必须自己动手吗?我在Google Play商店中有一个制作应用.我还使用Google Play测试版功能向有限群体发布了测试版.但是,如果我对生产应用程序进行了更改,那么我需要重新构建并重新发布测试版应用程序,因为它会被新的生产版本覆盖.当我想在不改变测试版的情况下对生产进行一些错误修复时,这非常令人沮丧.有没有办法在不使当前测试版失效的情况下发布新的制作应用程序?
我正在尝试动画画出一个圆圈.在我的自定义视图中,我有
private final Paint mPaint = new Paint() {
{
setDither(true);
setStyle(Paint.Style.STROKE);
setStrokeCap(Paint.Cap.ROUND);
setStrokeJoin(Paint.Join.ROUND);
setColor(Color.BLUE);
setStrokeWidth(30.0f);
setAntiAlias(true);
}
};
...
protected void onDraw(Canvas canvas) {
super.onDraw();
if (mOval == null) {
mOval = new RectF(getLeft(), getTop(), getRight(), getBottom());
}
if (mPath == null) {
mPath = new Path();
mPath.moveTo(0, getHeight() / 2);
}
float sweepAngle = Math.min((float) mElapsedTime / 1000 * 60 * 1, 1) * 360;
if (sweepAngle == 0) {
mPath.reset();
} else if (mCurrentAngle != sweepAngle) { …Run Code Online (Sandbox Code Playgroud) 我有一个习惯View.在视图的构造函数中,我创建并添加了两个子视图.但是,使用LayoutParams.addRule()会导致一些问题.CENTER_HORIZONTAL工作等规则,但是当我尝试使用时ABOVE,子视图最终的高度为0.
这是我的构造函数中的代码:
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
mLayoutParams = new LayoutParams(width, height);
mLayoutParams.leftMargin = left;
mLayoutParams.topMargin = top;
mImage = new ImageView(getContext());
mImage.setImageDrawable(getResources().getDrawable(R.drawable.my_image_drawable));
mImage.setScaleType(ScaleType.FIT_XY);
mImage.setId(R.id.my_image_id);
addView(mImage, mLayoutParams);
mText = new TextView(getContext());
mText.setText(R.string.my_text);
mText.setId(R.id.my_text_id);
LayoutParams textParams = new LayoutParams(200, 40);
// textParams.addRule(CENTER_HORIZONTAL, TRUE); //Works
textParams.addRule(ABOVE, mImage.getId()); //Doesn't work
addView(mText, textParams);
Run Code Online (Sandbox Code Playgroud)
如果我使用设备监视器检查仿真器上的视图,我可以看到layout_height文本的视图是40,但是top,bottom和height参数都是0. measuredHeight看起来与屏幕宽度相同.
TextView高度设置为FILL_PARENT,重力为BOTTOM,并将其下边距设置为图像的高度,但我需要能够在文本上方添加另一个视图,这对此不起作用.我正在尝试为我的 Android 项目创建基线 lint 文件。我在主模块的 build.gradle 中设置了一个块:
lintOptions {
<some includes/excludes>
baseline file("lint-baseline.xml")
checkAllWarnings true
warningsAsErrors true
abortOnError false
}
Run Code Online (Sandbox Code Playgroud)
然后,我使用 lint 创建基线./gradlew lint<flavor/variant>并将单元测试任务设置为依赖于 lint。
然而,这给出了包含一些绝对路径的基线文件。罪魁祸首似乎是 a) 子模块中(但只有一些子模块,不是全部),或 b) 我的本地 gradle 缓存中。当我将基线推送到 CI 时,它会出现一堆新警告,因为路径不完全匹配。
一些例子包括:
<location
file="/Users/.../android/<submodule>/src/main/res/values/strings.xml"
line="4"
column="13"/>
<location
file="/Users/.../.gradle/caches/modules-2/files-2.1/com.google.auto.value/auto-value/1.3/4961194f62915eb45e21940537d60ac53912c57d/auto-value-1.3.jar"/>
Run Code Online (Sandbox Code Playgroud)
如何强制 lint 使用相对路径创建基线?
如果我在启用破坏性回退的情况下运行 Room 迁移:
Room.databaseBuilder(applicationContext, MyDb::class.java, "database-name")
.fallbackToDestructiveMigration()
.build()
Run Code Online (Sandbox Code Playgroud)
有没有办法确定是否触发了破坏性迁移以及迁移是否成功完成?我希望能够记录一些信息以进行跟踪。
我有一个看起来像这样的函数:
fun MyInput?.toOutput() : Output? {
if (this == null) return null
return Output(this.someValue)
}
Run Code Online (Sandbox Code Playgroud)
在我知道我MyInput的非空值的地方(例如,在以a input: MyInput作为参数的方法内部),我希望能够使用input.toOutputas Output代替Output?
我试过使用
contract {
returnsNotNull() implies (this@toOutput != null)
}
Run Code Online (Sandbox Code Playgroud)
但这意味着倒退。这告诉我,如果toOutput返回非空类型,则我input为非空。我想告诉分析器有关基于参数的返回值的信息。在Java中,我可以org.jetbrains.annotations.@Contract("null -> null ; !null -> !null")用来完成此任务。
Kotlin有办法做到这一点吗?
我有一个自定义样式SeekBar,我想添加标签.该SeekBar有一个进度绘制的,看起来像:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/seekbar_background"/>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
在seekbar_background9补丁看起来是这样的:

我想在酒吧的每一端都有一个标签.优选地,标签的文本将在每侧的灯泡上居中.看起来我应该能够TextView在端点上居中SeekBar,但我找不到一种方法将一个视图的中心与另一个视图的边缘对齐.
有没有办法,使用SeekBarAPI,或通过巧妙使用布局对齐,来实现这一目标?
我有一个基础抽象类public abstract class BaseModel <T extends BaseModel<T>>.通常,我会用类似的东西扩展这个类public class OtherModel extends BaseModel<OtherModel>.对于我的一些类,我想要一个中间抽象类,这样A扩展B扩展了BaseModel.
我希望能够宣布public class EndModel extends MiddleModel<EndModel>.我设法让Eclipse变得快乐的唯一方法是,如果我声明MiddleModel为public abstract class MiddleModel<T extends BaseModel<T>> extends BaseModel<T>,但这看起来很难看,现在我必须在我声明变量的地方添加一个类型MiddleModel,即使我实际上并不关心它是什么类型的是.有一个更好的方法吗?
我正在开发一个 android 项目,并且有许多使用相同凭据的自定义存储库:
repositories {
maven {
url "<url1>"
credentials {
username = "<username>"
password = "<password>"
}
}
maven {
url "<url2>"
credentials {
username = "<username>"
password = "<password>"
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法定义一个方法(块?),以便我可以定义一次用户名和密码而不必每次都重复?我希望能够做到:
repositories {
customMaven { url "<url1>"}
customMaven { url "<url2>"}
}
Run Code Online (Sandbox Code Playgroud)
抱歉,如果我在这里错误地使用了术语 - gradle 语法对我来说有点神秘。
android ×10
android-auto ×1
android-lint ×1
android-room ×1
android-view ×1
bezier ×1
generics ×1
google-play ×1
gradle ×1
java ×1
kotlin ×1
maven ×1