小编Dan*_*ato的帖子

在Android视图剪辑边界外绘图时:如何防止底层视图在我的自定义视图上绘制?

我写了一个自定义Android视图,需要在其剪切边界之外绘制.

这就是我所拥有的:

在此输入图像描述

这是当我点击一个按钮时发生的情况,例如右键:

在此输入图像描述

如何防止下面的视图在我的"句柄"上绘制?

我项目中的一些相关伪代码如下.

我的自定义视图MyHandleView如下所示:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Path p = mPath;
    int handleWidth = mHandleWidth;
    int handleHeight = mHandleHeight;
    int left = (getWidth() >> 1) - handleWidth;

    canvas.save();

    // allow drawing out of bounds vertically
    Rect clipBounds = canvas.getClipBounds();
    clipBounds.inset(0, -handleHeight);
    canvas.clipRect(clipBounds, Region.Op.REPLACE);

    // translate up to draw the handle
    canvas.translate(left, -handleHeight);

    // draw my background shape
    canvas.drawPath(p, mPaint);

    canvas.restore();
}
Run Code Online (Sandbox Code Playgroud)

布局是这样的(我简化了一点):

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Main content of the SlidingUpPanel --> …
Run Code Online (Sandbox Code Playgroud)

android android-custom-view android-layout

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

你在哪里为Android/iOS谷歌产品或服务(AppInvites,地图等)提交错误?

我最近在AppInvites的Android SDK上发现了一个错误.

我在网上搜索,寻找AppInvites的bug跟踪器,找不到任何.

所以我在经典的b.android.com上发布了一个谷歌搜索者的回复:

抱歉,此跟踪器仅适用于Android操作系统的问题.请使用https://support.google.com/获取对Google产品或服务的支持.

这根本没用.支持谷歌页面只列出最终用户的支持页面,而不是开发人员的支持页面,并且那里没有什么可以作为AppInvite的错误跟踪工具.

于是,我就张贴在谷歌集团android-developers@googlegroups.com,只发现一个,而后来该组已经支持的StackOverflow的停产由谷歌.但由于我无法在此处对Google产品进行错误报告,因此我只是要求向Google报告错误的正确位置.

Google产品或服务示例:

  • Google Play服务Android/iOS SDK
  • Google AppInvites Android/iOS SDK
  • 谷歌地图Android/iOS SDK
  • Google Analytics Android/iOS SDK
  • 等等...

那么,我在哪里向Google提交有关开发人员的Android(或iOS)SDK /产品的错误?

编辑:这个问题已经结束,因为有些人认为这不是主题.不是!这说明了开发中常用的工具.在SDK中查找错误是编程的一部分.在这些工具上提交bug是一种很好的做法,有时也是修复bug的唯一选择.出于这个原因,我认为这是关于主题的.

android ios google-app-invites

23
推荐指数
1
解决办法
2601
查看次数

CoordinatorLayout + AppbarLayout + Viewpager不会调整子布局的大小

将CoordinatorLayout与ViewPager和ViewPager结合使用时遇到问题: 在此输入图像描述

布局未正确调整大小.认为解决的高度包括标签高度.所以当我滚动到底部时,我看到了这个:

在此输入图像描述

主要布局代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".activities.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/root_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <include layout="@layout/content_main" />
    </FrameLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

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

标签布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".activities.MainActivity"
    tools:showIn="@layout/activity_main"
    android:orientation="vertical">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <FrameLayout
        android:id="@+id/regularLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    </FrameLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

子布局代码

<RelativeLayout …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-viewpager android-coordinatorlayout android-appbarlayout

19
推荐指数
2
解决办法
7515
查看次数

我在哪里放置OBB文件来测试Nexus 4上的Android扩展包文件(OBB)?

我正在尝试按照此处的指南测试Android中的扩展包文件(OBB):http: //developer.android.com/google/play/expansion-files.html

我正处于需要在Nexus 4上测试我的应用程序的步骤.

我使用jobb生成了我的.obb文件,并在此位置的设备中将其adb推送:

/mnt/shell/emulated/0/Android/obb/my.package/main.1.my.package.obb
Run Code Online (Sandbox Code Playgroud)

当应用程序运行时,它找不到该文件.

方法:

Helpers.doesFileExist(context, fileName, xf.mFileSize, false)
Run Code Online (Sandbox Code Playgroud)

为我的文件返回false.

我调试并发现它正在寻找文件:

/storage/emulated/0/Android/obb/my.package/main.1.my.package.obb
Run Code Online (Sandbox Code Playgroud)

具体来说,这是返回的路径:

Helpers.generateSaveFileName(c, fileName)
Run Code Online (Sandbox Code Playgroud)

Environment.getExternalStorageDirectory()返回的/ storage/emulated/0不存在,使用adb shell浏览设备.

但是它在运行时,在应用程序内部,我还检查了它包含的内容:它包含了我在/ mnt/shell/emulated/0中发现的几乎相同的东西,它包含Android/obb目录,它是空的.

我如何找到路径/mnt/shell/emulated/0/Android/obb/my.package/main.1.my.package.obb我放置了我的obb文件:

$ adb shell
$ ls -ld sdcard
lrwxrwxrwx root     root              2013-10-16 17:34 sdcard -> /storage/emulated/legacy
$ ls -ld /storage/emulated/legacy
lrwxrwxrwx root     root              2013-10-16 17:34 legacy -> /mnt/shell/emulated/0
Run Code Online (Sandbox Code Playgroud)

在里面,我已经找到了Android/obb目录,空了.

所以问题是:我应该在哪里把我的obb文件放在运行时的正确位置?

我做了一切在那里说:

  • 在Market中创建了一个草案应用程序来获取公钥

  • 生成一个20字节的随机数组(盐)

  • 集成了play_licensing/library和play_apk_expansion/download_library

  • 写了我的服务/接收器

  • 使用助手等进行检查..完全像文件说的那样.

我想一切正常但我还不能在Play商店发布!我需要在本地测试,我需要在开发的初始阶段经常更改我的obb文件.

我无法在模拟器上测试,因为我使用3D和设备相机.

android apk-expansion-files

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

升级到Android Studio 3.1后无法加载类'com.android.builder.Version'

我已经升级到Canary频道的Android Studio 3.1,我无法再构建我的项目了,这个错误被打印出来了:

无法加载类'com.android.builder.Version'.此意外错误的可能原因包括:

  • Gradle的依赖缓存可能已损坏(这有时会在网络连接超时后发生.)重新下载依赖项并同步项目(需要网络)
  • Gradle构建过程(守护程序)的状态可能已损坏.停止所有Gradle守护进程可以解决此问题.停止Gradle构建过程(需要重启)

您的项目可能正在使用第三方插件,该插件与项目中的其他插件或项目请求的Gradle版本不兼容.在损坏的Gradle进程的情况下,您还可以尝试关闭IDE,然后终止所有Java进程.

我已经尝试了这两种解决方案,并尝试删除所有~/.gradle/caches目录,但错误仍然存​​在.

寻找类似的错误我发现旧版本的Android Studio与升级Android工具版本的建议解决方案存在此问题.

我想我已经有了最后一个:

    classpath 'com.android.tools.build:gradle:3.1.0-alpha01'
Run Code Online (Sandbox Code Playgroud)

编辑(2017年10月30日):

答案表明有人在遇到问题而有人没有.正如在这个问题的评论中所指出的,这可能是由一个不兼容的插件引起的,所以我列出了我的项目中使用的插件:

buildscript {
    ext.kotlin_version = '1.1.51'
    repositories {
        jcenter()
        google()
//        maven {
//            url 'https://maven.google.com'
//        }
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.gradle:build-scan-plugin:1.10"
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.1'
        classpath 'com.android.tools.build:gradle:3.1.0-alpha01'
        classpath 'com.google.gms:google-services:3.1.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
Run Code Online (Sandbox Code Playgroud)

由于与Android插件的新版本存在某些不兼容性,因此dexcount目前尚未使用.

android android-studio android-studio-3.1

11
推荐指数
1
解决办法
4809
查看次数

带导航组件的单个活动:如何处理不同的AppBar /主题

自Google I/O宣布之后不久,我一直在使用新的导航组件,并且也开始尽可能地接受单项活动.

单一活动允许我在视图之间共享ViewModel以获得非常棒的体验,如果我没有被迫,我真的不想回到多活动.

但是有一些东西阻碍了:AppBar/Themes(状态栏)到单一活动的概念.

这是我正在进行的设计的一部分:

AppBar设计在不同的部分

正如您所看到的,Actionbar /状态栏的外观有不同的要求.

  1. 这是一个带有标准动作栏的简单抽屉
  2. 图像在半透明状态栏下的经典细节,CollapsingToolbarLayout在向上滚动时应该用于变成标准动作栏
  3. 在这种情况下,它是非标准的操作栏,我称之为"浮动工具栏",因为它没有扩展到屏幕的全部,并包含已经扩展的SearchView/EditText
  4. 带标签的相当标准的AppBar

离开单项活动所产生的问题清单:

  • 不能ViewModel在活动之间分享
  • 重复使用已在另一个活动导航图中定义的部分的复杂导航必须复制/移动到专用活动中
  • 返回导航"重建"在活动之间不起作用

如果可能的话,这些是我想要避免的问题,但是你们如何在导航组件的单一活动中管理这些情况.任何的想法?

android-layout android-fragments android-architecture-navigation

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

Google Home如何以编程方式获取特定wifi的密码?

在Google Home应用中,该应用可以与GoogleHome连接,而无需询问连接密码。

即使该应用程序没有root权限也可以执行此操作。Google Home如何与设备连接?

android android-wifi google-home

8
推荐指数
2
解决办法
1025
查看次数

Android Studio 中的普通 Java 库在编辑器中给出编译错误:无法访问“java.io.Serializable”,它是

我开始使用带有数据和域层的干净架构在 kotlin 中开发一个 Android 项目,域层是一个普通的 java 库(没有 android 依赖项)

这是域模块相关的 gradle conf:

plugins {
    id("java-library")
    id("kotlin")
    id("kotlin-kapt")
}

java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}

dependencies {
    api(kotlin("stdlib-jdk8"))
    // ....
}
Run Code Online (Sandbox Code Playgroud)

如果我从命令行或在 android studio 中运行构建,它会成功完成

但是 Android Studio仅针对此模块在 EDITOR 中给了我很多奇怪的错误:

Cannot access 'java.io.Serializable' which is a supertype of 'kotlin.Double'. Check your module classpath for missing or conflicting dependencies
Cannot access 'java.io.Serializable' which is a supertype of 'kotlin.String'. Check your module classpath for missing …
Run Code Online (Sandbox Code Playgroud)

java intellij-idea gradle kotlin android-studio

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

如何通过Android上的retrofit2使用Cognito Credentials调用API网关?

retrofit2在我的Android应用程序中使用任何http/rest调用.现在我需要调用使用Amazon AWS API Gateway生成的api .

AWS文档我应该生成客户端代码抛出API网关控制台并使用该类ApiClientFactory来构建请求:

ApiClientFactory factory = new ApiClientFactory();

// Use CognitoCachingCredentialsProvider to provide AWS credentials
// for the ApiClientFactory
AWSCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        context,          // activity context
        "identityPoolId", // Cognito identity pool id
        Regions.US_EAST_1 // region of Cognito identity pool
};

factory.credentialsProvider(credentialsProvider);

// Create an instance of your SDK (this should come from the generated code).
final MyApiClient client = factory.build(MyApiClient.class);

// Invoke a method (e.g., 'parentPath1Get(param1,body)') exposed …
Run Code Online (Sandbox Code Playgroud)

android amazon-cognito aws-sdk aws-api-gateway retrofit2

6
推荐指数
2
解决办法
2915
查看次数

使用 Android 库 (AAR) 作为带有 Gradle 的 Java (Jar) 项目的依赖项

Java Jarbuild.gradle模块:

apply plugin: 'java'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'junit:junit:4.12'

    // rx
    compile "io.reactivex.rxjava2:rxjava:2.0.4"
    compile "io.reactivex.rxjava2:rxandroid:2.0.1"
}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"
Run Code Online (Sandbox Code Playgroud)

这个 Jar 应该是一个库,用作单元测试 android 项目的实用程序库:

apply plugin: 'com.android.application'

android {
    // ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // test
    testCompile 'junit:junit:4.12'
    testCompile project(':test-utils')

    // ... other non-test dependencies here (including rx)
}
Run Code Online (Sandbox Code Playgroud)

这包括:

    testCompile project(':test-utils')
Run Code Online (Sandbox Code Playgroud)

失败:

错误:模块 'my-android-app:test-utils:unspecified' 依赖于一个或多个 Android 库,但它是一个 jar

这是因为RxAndroid是一个 Android .aar 库。 …

android unit-testing gradle rx-android

5
推荐指数
0
解决办法
1473
查看次数

如何在反应式编程中抑制onComplete?(RxJava)

感冒 Observable了,无法控制。订阅后,它总是会产生(如果没有错误):

onNext()

onCompleted()

我有一个这样的帮助器类:

public class Helper {

    private Subscription subscription;
    private ReplaySubject<MyData> subject;
    private Observable<MyData> coldObservable;

    public HelperClass(Observable<MyData> aColdObservable) {
        coldObservable = aColdObservable;
        subject = ReplaySubject.create(1);
        triggerRefresh();
    }

    public Observable<MyData> getObservable() {
        return subject.asObservable();
    }

    public void triggerRefresh() {
        if (subscription != null) {
            subscription.unsubscribe();
            subscription = null;
        }
        subscription = coldObservable
                              .subscribeOn(Schedulers.io())
                              .observeOn(Schedulers.computation())
                              .subscribe(subject);
    }
}
Run Code Online (Sandbox Code Playgroud)

我对该主题有多个订阅,请为客户端使用以下伪代码:

public class Client {

    private final Helper helper;
    private Observable<MyData> proxiedObservable;

    public Client(Observable<MyData> coldObservable) {
        helper = new …
Run Code Online (Sandbox Code Playgroud)

reactive-programming rx-java

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

使用@InverseBindingAdapter/AttrChanged的Android Spinner双向绑定不起作用

我一直试图在Spinner上设置一个双向绑定.

网上有很多这样的例子,这里有堆栈溢出,但它们都不适用于我.

它只是一个国家的微调器,我用这种方法为它定义了一个国家适配器:

@InverseBindingAdapter(attribute = "selectedCountry", event = "selectedCountryAttrChanged")
public static String bindCountryInverseAdapter(AppCompatSpinner pAppCompatSpinner) {
    Object selectedItem = pAppCompatSpinner.getSelectedItem();
    SpinnerAdapter adapter = pAppCompatSpinner.getAdapter();
    if (adapter instanceof CountrySpinnerAdapter) {
        return (String) selectedItem;
    }
    throw new UnsupportedOperationException("The adapter must be a CountrySpinnerAdapter");
}

@BindingAdapter(value = "selectedCountryAttrChanged", requireAll = false)
public static void bindCountryChanged(AppCompatSpinner pAppCompatSpinner, final InverseBindingListener newTextAttrChanged) {
    AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            newTextAttrChanged.onChange();
        }

        @Override
        public void onNothingSelected(AdapterView<?> …
Run Code Online (Sandbox Code Playgroud)

android android-databinding

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