小编Tob*_*ich的帖子

Android ActionBar自定义搜索视图

---解决了问题 - 在编辑文本中添加了答案---

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)

我想做两件事:

  1. 更改显示在文本字段中的文本"搜索"的颜色.看起来我用我的主题中的整体文字样式改变了它,但我希望我能以某种方式设置单独的颜色.

  2. 打开此搜索视图时,它将显示在操作栏的左侧.但我需要在右侧.图标(放大镜)实际上位于条形图的右侧,但按下它会打开左侧的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折叠到放大镜.笨拙的风格,但它的工作原理.:-)

customization android actionbarsherlock searchview

44
推荐指数
3
解决办法
8万
查看次数

Android:以编程方式设置ImageView layout_height

我的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弄清楚如何做到这一点,但我无法成功.

谢谢.

android android-imageview

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

Android Gradle - 在哪里添加"android.debug.obsoleteApi = true"

我更新到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

他们的网站上提供了更多信息:

https://developer.android.com/studio/releases/gradle-plugin?utm_source=android-studio#behavior_changes

但我并不完全理解.他们说:

要查看其他信息,您需要在项目的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)

android android-studio android-gradle-plugin

21
推荐指数
2
解决办法
7734
查看次数

如何使用Retrofit发送数组/列表

我需要将一个列表/一个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 http-post retrofit

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

Android App开始慢 - dex2oat Zip缺席.取消 - Gradle 2.10

我写了一个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

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

Android studio,构建kotlin时出现奇怪错误:生成错误的代码

我正在尝试几天来构建我的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

8
推荐指数
1
解决办法
983
查看次数

Android 设置 Nightmode 更改资源语言

这是一种难以描述的效果。

我们的 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

8
推荐指数
1
解决办法
689
查看次数

GSON没有解析布尔值(总是假的)

我正在使用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)

java json boolean gson retrofit

6
推荐指数
1
解决办法
735
查看次数

什么是三星Galaxy S3的堆大小?

我有一个小动画(AnimationDrawable),由9帧组成,分辨率为480x800.

当我在我的"旧"SGS1上运行动画时,一切都很好.现在我得到了S3,完全相同的代码给了我一个outofMemoryError.这不是我对QuadCore/1GB RAM手机的期望.当我降低动画的分辨率时,一切正常.

他们真的减少了内存/堆吗?

heap out-of-memory android-animation galaxy

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

Android Google BillingClient 如何获取未消耗的物品?

问题:使用 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

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