小编kar*_*arl的帖子

Android 4上安装Android Studio的NoClassDefFoundError

我正在将现有应用程序从Eclipse转换为Android Studio.但是,当我在运行4.x的设备上运行它时(我在模拟器上测试了几个版本),它会立即崩溃NoClassDefFoundError.

我已经尝试评论了对它找不到的类的引用,但总会有另一个.据我所知,犯罪类总是如此

  1. 在我自己的代码中
  2. 内部类(更新:通过更多调查,这个并不总是如此)

在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 android-studio android-gradle-plugin

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

实现 Android Auto 语音命令支持

我正在使用媒体播放器回调方法为 Android Auto 实现语音命令。我无法让 Auto 识别出我要求在我的应用程序上播放标题:“Play [x] on MyApp”。我知道这个命令发布后需要几天时间才能工作,但我仍然可以说“Play [x]”媒体会话已经在运行,它应该使用onPrepareFromSearchonPlayFromSearch方法来搜索和播放内容。

当我说“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以标记我的应用程序可用于搜索媒体
  • 实施onPrepareFromSearchonPlayFromSearch在我的MediaSessionCompat.Callback
  • 添加ACTION_PLAY_FROM_SEARCHACTION_PREPARE_FROM_SEARCH作为支持的操作。
  • 设置媒体会话标志FLAG_HANDLES_MEDIA_BUTTONSFLAG_HANDLES_TRANSPORT_CONTROLS
  • 根据此处的文档添加了对 Android …

android android-auto google-assistant-sdk

15
推荐指数
0
解决办法
719
查看次数

Android DateUtils标志解释

getRelativeTimeSpanString (long time, long now, long minResolution, int flags)用来计算相对日期.文档说这flags是"格式化选项的一点掩盖,例如FORMAT_NUMERIC_DATE或FORMAT_ABBREV_RELATIVE".但是,定义了大约十几个其他标志DateUtils,并且只有任何具有任何描述的标志都被弃用.

  1. 是否可以使用任何其他标志getRelativeTimeSpanString()
  2. 其他旗帜的实际行为是什么?
  3. 具体来说,我想出来的东西一样5d,6h2m,但我没有看到任何东西,看起来像它这样做的.我必须自己动手吗?

android android-dateutils

9
推荐指数
0
解决办法
2366
查看次数

在Google Play上发布新的制作版本,而不会影响Beta

我在Google Play商店中有一个制作应用.我还使用Google Play测试版功能向有限群体发布了测试版.但是,如果我对生产应用程序进行了更改,那么我需要重新构建并重新发布测试版应用程序,因为它会被新的生产版本覆盖.当我想在不改变测试版的情况下对生产进行一些错误修复时,这非常令人沮丧.有没有办法在不使当前测试版失效的情况下发布新的制作应用程序?

android google-play

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

Android使用Path绘制圆圈

我正在尝试动画画出一个圆圈.在我的自定义视图中,我有

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)

android bezier android-animation

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

以编程方式将ABOVE添加到LayoutParams会导致视图高度为0

我有一个习惯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看起来与屏幕宽度相同.

  1. 我是否在添加规则时出错?
  2. 有没有更好的地方添加规则?是否需要先发生一些事情?
  3. 还有其他选择吗?将TextView高度设置为FILL_PARENT,重力为BOTTOM,并将其下边距设置为图像的高度,但我需要能够在文本上方添加另一个视图,这对此不起作用.

android relativelayout android-layout android-view

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

如何在 Android Lint 基线中强制使用相对路径

我正在尝试为我的 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 使用相对路径创建基线?

android android-lint

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

检测是否进行了房间破坏性迁移

如果我在启用破坏性回退的情况下运行 Room 迁移:

Room.databaseBuilder(applicationContext, MyDb::class.java, "database-name")
        .fallbackToDestructiveMigration()
        .build()
Run Code Online (Sandbox Code Playgroud)

有没有办法确定是否触发了破坏性迁移以及迁移是否成功完成?我希望能够记录一些信息以进行跟踪。

android android-room

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

Kotlin合约推断返回值而不是参数值

我有一个看起来像这样的函数:

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有办法做到这一点吗?

kotlin kotlin-contracts

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

自定义搜索栏上的Android标签

我有一个自定义样式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,或通过巧妙使用布局对齐,来实现这一目标?

android android-layout

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

使用Java中的抽象类扩展抽象泛型类

我有一个基础抽象类public abstract class BaseModel <T extends BaseModel<T>>.通常,我会用类似的东西扩展这个类public class OtherModel extends BaseModel<OtherModel>.对于我的一些类,我想要一个中间抽象类,这样A扩展B扩展了BaseModel.

我希望能够宣布public class EndModel extends MiddleModel<EndModel>.我设法让Eclipse变得快乐的唯一方法是,如果我声明MiddleModelpublic abstract class MiddleModel<T extends BaseModel<T>> extends BaseModel<T>,但这看起来很难看,现在我必须在我声明变量的地方添加一个类型MiddleModel,即使我实际上并不关心它是什么类型的是.有一个更好的方法吗?

java generics

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

在 gradle 中重构 maven 块

我正在开发一个 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 gradle maven android-gradle-plugin

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