---解决了问题 - 在编辑文本中添加了答案---
我ActionBar在我的Android应用程序中使用了Sherlock.在那里,我想展示一个SearchView.它到目前为止工作正常,但我意识到,我在尝试自定义时做错了.
我这样创建它:
searchView.setQueryHint("Search: ");
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(...);
searchMenuItem = menu.add("Search place");
searchMenuItem.setIcon(R.drawable.ic_action_search)
.setActionView(searchView)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
Run Code Online (Sandbox Code Playgroud)
我想做两件事:
更改显示在文本字段中的文本"搜索"的颜色.看起来我用我的主题中的整体文字样式改变了它,但我希望我能以某种方式设置单独的颜色.
打开此搜索视图时,它将显示在操作栏的左侧.但我需要在右侧.图标(放大镜)实际上位于条形图的右侧,但按下它会打开左侧的EditTextfield.我尝试使用LayoutParams但是在尝试使用LayoutParams将其添加到Action Bar时,我遗漏了一些必要的东西.

所以希望有人可以帮助我.
谢谢你,托比亚斯
----编辑----
好的,所以有一件事已经解决了.通过XML添加ActionBar使TextEdit向右.
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
Log.e(TAG, "searchView: " + searchView);
Run Code Online (Sandbox Code Playgroud)
在我的menu.xml中
<item android:id="@+id/action_search"
android:title="Search"
android:icon="@drawable/ic_action_search"
android:showAsAction="always"
android:actionViewClass="com.actionbarsherlock.widget.SearchView" />
Run Code Online (Sandbox Code Playgroud)
所以至少有一个谜团解决了(为什么这会产生影响).但是新创建的XML在调用时不再关闭
searchMenuItem.collapseActionView();
Run Code Online (Sandbox Code Playgroud)
所以它仍然有问题.
---编辑2 ---
只是让你知道.我找到了文字颜色的解决方案.它可以通过使用SearchView的AutoCompleteTextView来实现:
AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(R.color.white));
searchText.setTextColor(getResources().getColor(R.color.white));
Run Code Online (Sandbox Code Playgroud)
所以我遇到的最后一个问题是SearchView在提交文本时不再关闭.所以collapseActionView()等不起作用.有任何想法吗?
---编辑3 ---
好的,我找到了解决方案.我不知道这是否是正确的方法,但在使用时
((SearchView) searchMenuItem.getActionView()).setIconified(true);
Run Code Online (Sandbox Code Playgroud)
它关闭了 EditText
我必须做两次,因为第一次只是"删除"我的输入文本并显示"提示",而第二次使用是"关闭"提示EditText并将searchView折叠到放大镜.笨拙的风格,但它的工作原理.:-)
我的main.xml文件中有一个ImageView:
<ImageView
android:id="@+id/pageImage"
android:layout_width="270dp"
android:layout_height="45dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="25dp"
android:layout_marginTop="15dp"
android:scaleType="fitXY"
android:src="@drawable/pageimage" />
Run Code Online (Sandbox Code Playgroud)
我只需要以layout_height编程方式将其设置为另一个值.
另外,我需要在dp中设置值.所以它目前是45dp,我想在主要活动中将其更改为另一个值.
我试图用LayoutParams弄清楚如何做到这一点,但我无法成功.
谢谢.
我更新到AndroidStudio 3.3,它现在发出关于已弃用库的警告:
警告:API'variable.getExternalNativeBuildTasks()'已过时,已替换为'variant.getExternalNativeBuildProviders()'.它将在2019年底删除.有关更多信息,请参阅 https://d.android.com/r/tools/task-configuration-avoidance.要确定调用variant.getExternalNativeBuildTasks()的内容,请在命令行上使用-Pandroid.debug.obsoleteApi = true来显示堆栈跟踪.受影响的模块:app
他们的网站上提供了更多信息:
但我并不完全理解.他们说:
要查看其他信息,您需要在项目的gradle.properties文件中包含以下内容:
android.debug.obsoleteApi =真
所以我选了标有的Project.gradle(Project:[my project])
该文件如下:
buildscript {
ext.kotlin_version = '1.3.10'
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.google.gms:google-services:4.0.1'
classpath 'com.github.triplet.gradle:play-publisher:1.1.5'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
maven {
url "https://jitpack.io"
}
mavenCentral()
}
}
project.ext.preDexLibs = !project.hasProperty('disablePreDex')
subprojects {
project.plugins.whenPluginAdded { plugin ->
if ("com.android.build.gradle.AppPlugin" == plugin.class.name) {
project.android.dexOptions.preDexLibraries = rootProject.ext.preDexLibs
} else if ("com.android.build.gradle.LibraryPlugin" …Run Code Online (Sandbox Code Playgroud) 我需要将一个列表/一个Integer值数组与Retrofit一起发送到服务器(通过POST)我这样做:
@FormUrlEncoded
@POST("/profile/searchProfile")
Call<ResponseBody> postSearchProfile(
@Field("age") List<Integer> age
};
Run Code Online (Sandbox Code Playgroud)
并像这样发送:
ArrayList<Integer> ages = new ArrayList<>();
ages.add(20);
ages.add(30);
ISearchProfilePost iSearchProfile = gsonServerAPIRetrofit.create(ISearchProfilePost.class);
Call<ResponseBody> call = iSearchProfile.postSearchProfile(
ages
);
Run Code Online (Sandbox Code Playgroud)
问题是,值到达服务器而不是以逗号分隔.所以这里的价值就像年龄:2030而不是年龄:20,30.
我正在阅读(例如这里/sf/answers/26071/54442/1565635),有些人通过使用[]编写参数来获得成功,就像一个数组,但只导致名为age []的参数:2030.我也尝试使用Arrays以及带字符串的列表.同样的问题.一切都直接进入一个条目.
那我该怎么办?
我写了一个Android应用程序到目前为止工作正常.然后我添加了Google Cloud Messaging(GCM)的功能.我使用了谷歌的演示项目,它似乎增加了分析和应用程序索引等.
现在启动应用程序按预期工作但需要花费很多时间.日志显示许多这样的消息:
I/dex2oat: ----------------------------------------------------
I/dex2oat: <SS>: S T A R T I N G . . .
I/dex2oat: <SS>: Zip is absent. Canceled.
I/dex2oat: /system/bin/dex2oat --runtime-arg -classpath --runtime-arg --instruction-set=arm --instruction-set-features=div --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --dex-file=/data/data/world.b2g.b2gether/files/instant-run/dex/slice-com.google.android.gms-play-services-measurement-8.4.0_d76b40d326ea93493481fa158b18846c1c4627dd-classes.dex --oat-fd=29 --art-fd=-1 --oat-location=/data/data/world.b2g.b2gether/cache/slice-com.google.android.gms-play-services-measurement-8.4.0_d76b40d326ea93493481fa158b18846c1c4627dd-classes.dex --runtime-arg -Xms64m --runtime-arg -Xmx512m
I/dex2oat: dex2oat took 288.616ms (threads: 4)
I/dex2oat: ----------------------------------------------------
I/dex2oat: <SS>: S T A R T I N G . . .
I/dex2oat: <SS>: Zip is absent. Canceled.
I/dex2oat: /system/bin/dex2oat --runtime-arg -classpath --runtime-arg --instruction-set=arm --instruction-set-features=div --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art …Run Code Online (Sandbox Code Playgroud) android gradle google-cloud-messaging google-play-services android-instant-run
我正在尝试几天来构建我的android项目(主要包含kotlin)...我试图改变所有版本的版本,并且我在构建时不断收到同样的错误!
我得到的消息看起来像这样:
Kotlin编译器:
org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: wrong code generated
Run Code Online (Sandbox Code Playgroud)
Java编译器:
org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Couldn't transform method node:
java.lang.IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)
我没有做任何可能导致它发生的戏剧性变化......我试图重建,清理,删除所有内容,更改所有版本的版本,但我仍然无法摆脱它.
我怎么解决这个问题?
谢谢!
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugKotlin'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
at …Run Code Online (Sandbox Code Playgroud) android gradle kotlin android-studio kotlin-android-extensions
这是一种难以描述的效果。
我们的 Android 应用程序支持两种语言,但是我们不使用系统语言而是让用户在设置中进行设置。然后,在附加应用程序的 BaseContext 之前,我们设置语言环境配置。
// in Application class
override fun attachBaseContext(base: Context) {
super.attachBaseContext(LocaleHelper.onAttach(base))
}
// the LocaleHelper
fun onAttach(context: Context): Context {
return setLocale(context, getPersistedLanguage(context), getPersistedCountry(context))
}
Run Code Online (Sandbox Code Playgroud)
这样,attachBaseContext 调用就会获得一个上下文,该上下文的语言环境设置为例如“de”而不是“en”——即使设备是英文的。
到目前为止,这很有效,并且根据设置,来自上下文的所有资源都使用该语言。但是,我们现在为夜间模式添加了另一个设置(即让用户可以选择在“正常”或“黑暗模式”中设置“主题”)。
出于这个原因,我们的想法是设置这样的东西
if (enableDarkMode) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
Run Code Online (Sandbox Code Playgroud)
在应用程序的 onCreate() 中(我们也在 Activity 中尝试过)。
但是,这样做时,突然间资源(至少一些)加载了设备区域设置。菜单条目采用设备语言。但是,检查 Locale.getLanguage() 给了我配置的语言和动态调用的字符串(例如 context.getString(R.string.xyz))也以正确配置的语言显示。
这导致假设菜单资源有些(重新)加载(再次)但不尊重来自 JVM 的设置区域设置。
有谁知道如何找到那个错误?我们在这里缺少什么?菜单资源的加载方式不同吗?
android android-appcompat android-resources android-night-mode
我正在使用Retrofit来获取JSON文档.问题是,所有布尔值总是错误的.
响应如下:
{
"gender":[0,1],
"age":[20,30],
"likesLeaveHome":false,
"likesSport":false,
"likesCulture":false,
"likesTraveling":false
...
}
Run Code Online (Sandbox Code Playgroud)
我正在调用改造方法
onResponse(Call<SearchProfile> call, Response<SearchProfile> response)
Run Code Online (Sandbox Code Playgroud)
而应该解析响应的SearchProfile类看起来像这样:
public class SearchProfile {
public ArrayList<Integer> gender = new ArrayList<>(); // works fine
public ArrayList<Integer> age = new ArrayList<>(); // works fine
...
public Boolean likesLeaveHome = true; // always false
@SerializedName("likesSport")
public boolean likesSport = true; // always false
@SerializedName("likesCulture")
public Boolean likesCulture; // always false
@SerializedName("likesTraveling")
public Boolean mLikesTraveling; // always false
public boolean isLikesTraveling() {
return mLikesTraveling;
}
public void …Run Code Online (Sandbox Code Playgroud) 我有一个小动画(AnimationDrawable),由9帧组成,分辨率为480x800.
当我在我的"旧"SGS1上运行动画时,一切都很好.现在我得到了S3,完全相同的代码给了我一个outofMemoryError.这不是我对QuadCore/1GB RAM手机的期望.当我降低动画的分辨率时,一切正常.
他们真的减少了内存/堆吗?
问题:使用 Google Play BillingClient 1.1 我怎样才能只获得未消费的购买?
背景:
在我们的 Android 应用程序中,我们希望使用新的
com.android.billingclient:billing:1.1
Run Code Online (Sandbox Code Playgroud)
这个想法是使用
BillingClient.queryPurchases(BillingClient.SkuType.INAPP)
为了获得用户所做的所有购买的“历史”。这就是 API 所说的(https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#queryPurchases(java.lang.String))并且它工作正常。在旧版本中,您只会获得未消费的物品,这对于“购买历史”之类的东西是无用的。但是,如果我想知道是否有未消耗的物品,则无法再获得该信息。
对于queryPurchaseHistoryAsync().
Purchase 对象似乎不包含有关其消费的任何信息。我怎样才能只获得未消耗的物品(或至少过滤它们)?
请注意,我知道购买最终必须在我们的服务器端进行管理。但是,在此操作成功之前,最好知道哪个项目已被“兑换”(已消费)。所以我不能只依赖我们的后端。
- - 编辑 - -
来自查询的购买对象 (JSON) 都如下所示:
{
"orderId": "[Id]",
"packageName": "[just the app's package]",
"productId": "[the SKU name]",
"purchaseTime": 1531224460215,
"purchaseState": 0,
"purchaseToken": "[a purchase token]"
}
Run Code Online (Sandbox Code Playgroud)
所以没有什么似乎是消费状态。
---- 编辑 2 ----
我找到了一个(坏的)解决方案。当尝试消费购买时,谷歌用它的返回码告诉我它是否已经消费。但这对我们来说不是一个解决方案,因为我们希望将其“标记为未消费”,直到它在我们的服务器上被兑换。
android in-app-purchase in-app-billing android-inapp-purchase