我写了一个自定义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) 我最近在AppInvites的Android SDK上发现了一个错误.
我在网上搜索,寻找AppInvites的bug跟踪器,找不到任何.
所以我在经典的b.android.com上发布了一个谷歌搜索者的回复:
抱歉,此跟踪器仅适用于Android操作系统的问题.请使用https://support.google.com/获取对Google产品或服务的支持.
这根本没用.支持谷歌页面只列出最终用户的支持页面,而不是开发人员的支持页面,并且那里没有什么可以作为AppInvite的错误跟踪工具.
于是,我就张贴在谷歌集团android-developers@googlegroups.com,只发现一个,而后来该组已经支持的StackOverflow的停产由谷歌.但由于我无法在此处对Google产品进行错误报告,因此我只是要求向Google报告错误的正确位置.
Google产品或服务示例:
那么,我在哪里向Google提交有关开发人员的Android(或iOS)SDK /产品的错误?
编辑:这个问题已经结束,因为有些人认为这不是主题.不是!这说明了开发中常用的工具.在SDK中查找错误是编程的一部分.在这些工具上提交bug是一种很好的做法,有时也是修复bug的唯一选择.出于这个原因,我认为这是关于主题的.
将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
我正在尝试按照此处的指南测试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和设备相机.
我已经升级到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目前尚未使用.
自Google I/O宣布之后不久,我一直在使用新的导航组件,并且也开始尽可能地接受单项活动.
单一活动允许我在视图之间共享ViewModel以获得非常棒的体验,如果我没有被迫,我真的不想回到多活动.
但是有一些东西阻碍了:AppBar/Themes(状态栏)到单一活动的概念.
这是我正在进行的设计的一部分:
正如您所看到的,Actionbar /状态栏的外观有不同的要求.
CollapsingToolbarLayout在向上滚动时应该用于变成标准动作栏离开单项活动所产生的问题清单:
ViewModel在活动之间分享如果可能的话,这些是我想要避免的问题,但是你们如何在导航组件的单一活动中管理这些情况.任何的想法?
android-layout android-fragments android-architecture-navigation
在Google Home应用中,该应用可以与GoogleHome连接,而无需询问连接密码。
即使该应用程序没有root权限也可以执行此操作。Google Home如何与设备连接?
我开始使用带有数据和域层的干净架构在 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) 我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) 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 库。 …
我感冒 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) 我一直试图在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 ×9
gradle ×2
android-architecture-navigation ×1
android-wifi ×1
aws-sdk ×1
google-home ×1
ios ×1
java ×1
kotlin ×1
retrofit2 ×1
rx-android ×1
rx-java ×1
unit-testing ×1