我开发了一个Android应用,使用Moshi作为其依赖项之一。
今天,我想为此项目启用minify。所以我开始minifyEnabled true了build.gradle。
之后,我发现来自服务器的所有响应都为空。
首先,我正在使用Retrofit2来调用API。中的JSON主体Response.body()不为null,并且具有正确的值。
响应主体如下(简化):
{"status":"success","data":{"user": "I am a user"}}
我正在使用下面的代码将其转换为我自己的对象:
val someResponse = Moshi.Builder().add(KotlinJsonAdapterFactory()).build().adapter(SomeResponse::class.java).fromJson(theJsonString)
而代码为SomeResponse:
class SomeResponse {
@Json(name="status")
var status: String? = null
@Json(name="data")
var data: User? = null
}
Run Code Online (Sandbox Code Playgroud)
然后,我只是使用Log.i("Moshi", "${someResponse.status}"来查看值,结果是null。
我已经包含在Moshi Github上,这是的README部分中指定的proguard的规则,这一个和这一个。
为什么以及如何解决这个问题?
供参考,以下是我的全部内容proguard-rules.pro:
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in …Run Code Online (Sandbox Code Playgroud) 自发布支持库v26发布以来,Google发布了官方字体资源处理:https: //developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html
但是,看起来我无法为字体资源文件夹添加country限定符.
我有一个应用程序有3种语言:英语,繁体中文和简体中文.
我试着用res这种方式命名我的字体文件夹:(
font
font-zh
font-zh_CN
我也试过font-zh-CN)
(注意这zh是语言,CN而是国家.有更多的背景信息 - 在中国我们都使用"中文",但有简体中文和繁体中文;而且,香港和台湾都使用繁体中文但是我们使用它们的方式有点不同.最重要的是,字体有繁体中文和简体中文的单独文件,因为它们的形状完全不同.)
但我无法建立这个项目.Android Studio一直告诉我font-zh_CN(或font-zh-CN)是无效的资源目录名称.
对于我的values-zh_CN文件夹(也不是values-zh-CN),这不会发生.
题:
从API 26开始,如何使用新的官方方法,为同一种语言但不同的国家/地区使用不同的字体?
我有一个Android项目,其中Glide v4是它的依赖项之一.
这个项目有另一个依赖,让我们称之为dependency A,它取决于Glide v3.
我不知道这是否重要,但dependency A只能作为aar包括在内.
所以这是我的一部分build.gradle:
implementation(name: 'dependency_a', ext: 'aar')
implementation ("com.github.bumptech.glide:glide:4.7.1") {
exclude group: "com.android.support"
}
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
Run Code Online (Sandbox Code Playgroud)
该应用程序可以编译; 但是当dependency A使用Glide v3的运行代码时:
Glide.with(context).load(imageUrl).asBitmap().into(new SimpleTarget<Bitmap>() {...}
Run Code Online (Sandbox Code Playgroud)
该应用程序因此消息崩溃:
java.lang.NoSuchMethodError: No virtual method load(Ljava/lang/String;)Lcom/bumptech/glide/DrawableTypeRequest; in class Lcom/bumptech/glide/RequestManager; or its super classes (declaration of 'com.bumptech.glide.RequestManager' appears in /data/app/{my.package.name}}-LItMzBkBqXw3lyYYdKp-SA==/base.apk:classes15.dex)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来保留Glide v3 dependency A,但仍然使用Glide v4来实现我的app和其他依赖项.
它甚至可能吗?
这是因为另一个dependency B需要我使用Glide v4.
我有一个ConstraintLayout高度的地方wrap_content.
根据孩子的身高,我希望它的高度能够折叠或扩展.简单而且很普通吧?
现在我的布局看起来像这样:

(首先,请忽略底部的异常超大边距.正如您所看到的,边距仅为16dp,但预览会产生很大的余量.)
我的问题是,如果将大矩形的可见性设置为gone,
根据文档ConstraintLayout,如果我将其设置goneMarginTop为某个值,即使其可见性,它也将保留该边距gone.这样我Request Date的父母就会有一些空间.
但是,这不能按预期工作.Request Date坚持其父母的底部:

(这又是一个破碎的预览.在我的真实应用程序中,我能够看到一个完整的请求日期)
我做错了什么吗?这是我的完整代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/colorBasicGrey"
android:layout_marginBottom="2dp">
<View
android:id="@+id/item_indicator"
android:layout_width="8dp"
android:layout_height="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/white"
android:layout_marginTop="24dp"
android:layout_marginLeft="24dp"/>
<TextView
android:id="@+id/group_member_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/group_member_join_group_request"
app:layout_constraintTop_toBottomOf="@id/item_indicator"
app:layout_constraintBottom_toTopOf="@id/item_indicator"
app:layout_constraintLeft_toRightOf="@id/item_indicator"
android:layout_marginLeft="8dp"
style="@style/general45"/>
<TextView
android:id="@+id/group_member_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/general45"
android:textAllCaps="true"
app:layout_constraintBaseline_toBaselineOf="@id/group_member_label"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="180dp"
tools:text="ABCDEFGHIJK"/>
<TextView
android:id="@+id/group_request_date_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/group_member_request_date_label"
app:layout_constraintTop_toBottomOf="@id/group_member_label"
app:layout_constraintLeft_toLeftOf="@id/group_member_label"
android:layout_marginTop="8dp"
style="@style/general45"/>
<TextView
android:id="@+id/group_request_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content" …Run Code Online (Sandbox Code Playgroud) 我刚刚创建了一个库并上传到bintray和jcenter.
在我的测试应用程序中,此库作为模块添加:
implementation project(':dropdownview')
一切都井井有条.
将库模块上传到jcenter后,我改为使用它:
implementation 'com.asksira.android:dropdownview:0.9.1
然后,当库尝试调用依赖于另一个库的方法时,会发生运行时错误:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.transitionseverywhere.TransitionSet" on path: DexPathList[[zip file "/data/app/com.asksira.dropdownviewdemo-6fj-Q2LdwKQcRAnZHd2jlw==/base.apk"],nativeLibraryDirectories=[/data/app/com.asksira.dropdownviewdemo-6fj-Q2LdwKQcRAnZHd2jlw==/lib/arm64, /system/lib64, /system/vendor/lib64]]
Run Code Online (Sandbox Code Playgroud)
(我按照本指南发布了库.我在使用相同的方法之前已经发布了3个库,它们都运行良好;但这是我第一次在我自己的库中包含另一个第三方库依赖项.)
然后我尝试更改我的库的第三方库依赖项
implementation 'com.andkulikov:transitionseverywhere:1.7.9'
至
compile 'com.andkulikov:transitionseverywhere:1.7.9'
(请注意,这不是app对我的库的依赖,而是我的库到另一个库)
然后再次上传到版本0.9.2的bintray.
implementation 'com.asksira.android:dropdownview:0.9.2
这次它工作了吗?!
这是Android Studio/Gradle的某种错误(但Google表示他们将在compile2018年底删除...),或者我做错了什么?
可在此处找到v0.9.1的完整源代码.
请注意,我并没有直接访问任何方法app来TransitionsEverywhere.具体来说,ClassNotFoundException当我点击DropDownView,并DropDownView调用expand()哪个是public内部方法时发生.
为了消除等因素的影响,以下是我已经改变之前试过的东西implementation来compile,根本没有运气:
dependencies android gradle android-studio android-gradle-plugin
假设我有一个简单的应用程序,有a SplashScreenActivity和a MainActivity.
以下是我的一部分AndroidManifest.xml:
<activity
android:name=".front.activities.splashscreen.SplashScreenActivity"
android:launchMode="standard"
android:screenOrientation="portrait"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".front.activities.main.MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/Main_Title"
android:launchMode="singleTop"
android:screenOrientation="portrait"/>
Run Code Online (Sandbox Code Playgroud)
我SplashScreenActivity打开MainActivity了onCreate().
如果应用程序是从Google Play而不是启动器启动的,如果我按下主页并单击启动器中的应用程序图标,SplashScreenActivity则会再次启动一个应用程序图标,因此会MainActivity在后端堆栈上再启动一个应用程序.
SplashScreenActivity已经重新启动的通知(或者通过查看日志)SplashScreenActivity并MainActivity启动.经过几次试验,如果我们按下后退按钮,我们会注意到MainActivity后面的堆栈中有多个.
SplashScreenActivity则会启动2 .但是,如果我再次从启动器按下应用程序图标,它将不会创建第3个SplashScreenActivity.它将首次推出MainActivity顶级产品.SplashScreenActivity给android:launchMode="singleTask".没有帮助.MainActivity给 …我很高兴谷歌发布了基于 RecyclerView 构建的ViewPager2,解决了旧 ViewPager 存在的很多问题。
我很快将旧的 ViewPager 代码替换为 ViewPager2:
用 xml 中的 ViewPager2 替换 ViewPager
替换FragmentPagerAdapter(FragmentManager)为FragmentStateAdapter(Fragment)
ViewPager 设置如下:
viewPager.adapter = fragmentAdapter
val mediator = TabLayoutMediator(tabLayout, viewPager, true) { tab, position ->
tab.text = fragmentAdapter.tabNames[position]
}
mediator.attach()
Run Code Online (Sandbox Code Playgroud)没有进行其他更改。
执行上述更改后,我意识到一个问题——
现在我的 ViewPager 是一个普通的水平寻呼机,我的每个片段fragmentAdapter都有一个垂直的RecyclerView.
我观察到,当 RecyclerView 的滚动位置为 0 时,该 RecyclerView 中的项目无法接收任何单击或长按事件,但可以滚动。一旦滚动,它可以再次收到点击。*
知道这ViewPager2也是一个RecyclerView,是否与嵌套的 RecyclerView 有关系?
android android-viewpager android-recyclerview android-touch-event android-viewpager2
这个问题是关于 Android Grouped Notifications。
根据官方文档,它提到:
注意:如果您的应用发送四个或更多通知且未指定组,系统会在 Android 7.0 及更高版本上自动将它们组合在一起。
问题是我发现这组通知是可点击的。
在我的测试中,我一共收到了 5 条通知,其中 4 条有自己的 pendingIntent,其中一个只是前台服务通知,不可点击且不可关闭。
虽然它们的点击行为在分开时可以正常工作,但当我点击其中的一组时,Android 只是在我当前的活动堆栈之上创建另一个入口活动。
我知道通过为每个通知指定不同的组 ID,我可以强制将它们分成不同的通知而不将它们分组;
有没有办法保留通知组功能,但使组不可点击?
在Android 9中,Google宣布了使用反射访问非SDK接口方法的新限制。
如果您的项目使用一个,则将显示对话框Detected problems with API compatibility (visit g.co/dev/appcompat for more info)。尽管据我所知,该对话框不会出现在发行版本中,但看起来将来开发人员将完全没有办法使用反射来完成他们想要的事情。
通过使用StrictMode该类,我能够记录所使用的反射方法。OkHttp库调用其中之一:
2019-02-01 13:45:43.260 14892-14892/com.xxx.xxx.xxx W/com.xxx.xxx.xxx: Accessing hidden method Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; (light greylist, reflection)
2019-02-01 13:45:43.261 14892-14892/com.xxx.xxx.xxx D/StrictMode: StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard;
at android.os.StrictMode.lambda$static$1(StrictMode.java:428)
at android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
at java.lang.Class.getDeclaredMethodInternal(Native Method)
at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
at java.lang.Class.getMethod(Class.java:2063)
at java.lang.Class.getMethod(Class.java:1690)
at okhttp3.internal.platform.AndroidPlatform$CloseGuard.get(AndroidPlatform.java:370)
at okhttp3.internal.platform.AndroidPlatform.<init>(AndroidPlatform.java:58)
at okhttp3.internal.platform.AndroidPlatform.buildIfSupported(AndroidPlatform.java:260)
at okhttp3.internal.platform.Platform.findPlatform(Platform.java:201)
at okhttp3.internal.platform.Platform.<clinit>(Platform.java:78)
at okhttp3.internal.platform.Platform.get(Platform.java:84)
at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:292)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:258)
at okhttp3.OkHttpClient$Builder.build(OkHttpClient.java:1040)
Run Code Online (Sandbox Code Playgroud)
我已经在使用最新版本的OkHttp库(3.12.1)。
如何摆脱对话?
场景是,我有一个 Python 脚本,其中一部分是使用以下代码执行外部程序:
subprocess.run(["someExternalProgram", "some options"], shell=True)
当外部程序完成时,它要求用户“按任意键退出”。
由于这只是我的脚本中的一个步骤,因此代表用户退出对我来说会更好。
是否有可能实现这一目标?如果可以,如何实现?