小编Oll*_*e C的帖子

无法从布局中获取元素

我有2个活动.第二个.xml看起来像:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <ListView 
            android:id="@+id/TrainsListView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
        />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

清单的一部分:

<activity android:name="TrainsActivity">

</activity>
Run Code Online (Sandbox Code Playgroud)

而我正在尝试获取TrainsListView:

mListView = (ListView) findViewById(R.id.TrainsListView);
Run Code Online (Sandbox Code Playgroud)

但在此mlistView为null之后.为什么?

layout android android-intent android-layout

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

如何检查是否存在GPS传感器?

我正在编写一种方法,如果存在并启用了GPS传感器,它将返回true,但如果没有或关闭则返回false.这证明很难,因为......

hasSystemFeature("FEATURE_LOCATION_GPS")  // on PackageManager
Run Code Online (Sandbox Code Playgroud)

无论设备是否具有GPS,都返回false.因此,即使在具有一个的设备上,并且它已打开,它仍然返回false.对我来说似乎完全错了,但我看不出原因.

isProviderEnabled("gps")   // on LocationManager
Run Code Online (Sandbox Code Playgroud)

返回true,即使在我这里没有GPS硬件的设备上也是如此.这似乎完全违反直觉.

我接受这些结果可能是因为我遗漏了一些东西,SDK不直观,或者甚至我正在测试的设备表现得很奇怪.

我错过了什么?

gps android

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

为什么我的应用尝试使用drawable-mdpi/title_bar_shadow.9.png?

该应用程序在HPDI和MDPI上运行良好,但是当在LDPI(v2.0)模拟器中运行时,我得到下面的异常和堆栈跟踪.

为什么要寻找这张图片?(它在我的应用程序中未引用,我已经检查过).在任何情况下,启动器活动都禁用了标题栏.

如果操作系统需要此图像,为什么它不存在?

当仿真器是LDPI时,为什么与MPDI映像有关的异常?

04-20 11:35:19.432: ERROR/AndroidRuntime(236): Uncaught handler: thread main exiting due to uncaught exception
04-20 11:35:19.502: ERROR/AndroidRuntime(236): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.spondle/com.spondle.EventsActivity}: android.view.InflateException: Binary XML file line #14: Error inflating class <unknown>
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2454)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2470)
        at android.app.ActivityThread.access$2200(ActivityThread.java:119)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:4310)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:521)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class <unknown>
        at android.view.LayoutInflater.createView(LayoutInflater.java:513)
        at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
        at …
Run Code Online (Sandbox Code Playgroud)

android android-layout

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

如何实施永久,定期,后台位置更新?

该应用程序需要一个底层功能,可以获取位置并将它们发送到服务器.这必须定期发生(大约每1-5分钟),但最重要的是它必须始终发生,永不停止,防止操作系统关闭进程以回收内存,以及应用程序本身未运行时.

我已经向我建议了以下解决方案.我熟悉处理Android位置,这里的问题是确保它们继续,即使应用程序不在内存中,并通过内存回收持续存在.

  1. 服务.使用服务收集位置事件并处理它们.使用boot和screen-on广播来确保服务始终在运行(并且还可能提高服务优先级以防止内存回收).

  2. 警报.我收集这些可以在内存短暂时关闭.我该如何防范呢?这似乎是一个丑陋的解决方案,因为位置无论如何都会按计划到达,因此似乎没有必要再使用其他基于时间的组件.

  3. 通过广播的位置.通过广播意图传送的位置意味着我可以在广播接收器中处理位置事件.这些位置警报会无限期地继续吗?除设备关闭或应用程序关闭以外的任何其他设备会导致它们停止吗?

什么是最耐用的方法?

android

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

为什么我的应用程序无法通过Market访问某些设备?

作为一个具体示例,该应用程序不适用于HTC Wildfire S.此设备在Android Market发布商控制台中列为其可用的设备之一,但Web Market显示应用程序和Wildfire不兼容.这显然令人困惑.该应用程序不适用于包括Galaxy S,Galaxy S2,Galaxy Ace在内的所有设备,即使这些设备也在市场控制台中显示为兼容.

以下是市场中显示的相关清单设置:

屏幕布局:SMALL NORMAL LARGE XLARGE

所需的设备功能

android.hardware.wifi

android.hardware.screen.landscape

android.hardware.touchscreen

该应用已付费,并且可供所有国家/地区使用,因此我认为这不是国家/地区问题.

我错过了什么?Android Market表示该应用可以使用这些设备,为什么不呢?我很难理解为什么Android Market的一方说它兼容,但面向公众的一方表示不是.这是怎么回事?

android

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

Android Test testPreconditions

在Android开发人员中,我已经看到testPreconditions()方法应该在所有测试之前启动.但是在我的app测试中,它的表现就像一个普通的测试.它不会在所有测试之前运行.有什么不对 ?

以下是来自android开发人员的testPreconditions()的描述:"前置条件测试在执行其他测试之前检查初始应用程序条件.它类似于setUp(),但开销较少,因为它只运行一次."

junit android unit-testing android-testing

5
推荐指数
2
解决办法
1504
查看次数

为什么 JodaTime 时区会改变日期时间?

当字符串“2017-04-21T17:46:00Z”被传递到第一个方法时,生成的格式化日期字符串是“06:46 21 Apr 2017”。为什么小时移动了十一小时?输入字符串由 HTTP 服务器应用程序以 JSON 格式提供。我以为 Z 后缀指的是祖鲁语,即 GMT。

private static final String DATE_TIME_FORMAT = "hh:mm dd MMM yyyy";

public static String formatTimestamp(String dateTimestamp) {
    DateTime dateTime = getDateTimeFromTimestamp(dateTimestamp);
    DateTimeFormatter fmt = DateTimeFormat.forPattern(DATE_TIME_FORMAT);
    return fmt.print(dateTime);
}

private static DateTime getDateTimeFromTimestamp(String dateTimestamp) {
    return new DateTime(dateTimestamp);
}
Run Code Online (Sandbox Code Playgroud)

我怀疑它与时区有关,但不清楚如何或在哪里。该代码在英国的 Android 设备上运行,采用 GMT 时区。

android jodatime android-jodatime

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

如何在Espresso UI测试中实施Jake Wharton的机器人模式?

杰克·沃顿(Jake Wharton)发表了精彩的演讲,他提出了一些聪明的方法来改善我们的UI测试,方法是从测试中抽象出我们如何执行UI的细节:https//news.realm.io/news/kau-jake-wharton-testing -机器人/

他给出的一个示例是如下所示的测试,其中PaymentRobot对象包含有关如何将付款金额和收件人输入UI的详细信息。将其放在一个地方很有意义,因此当UI不可避免地发生更改时(例如,重命名字段ID或从TextEdit切换到TextInputLayout),它只需要在一个地方进行更新,而无需进行一系列的测试。它还使测试更加简洁和易读。他建议使用Kotlin使它们更整洁。我不使用Kotlin,但仍然想从这种方法中受益。

@Test public void singleFundingSourceSuccess {
    PaymentRobot payment = new PaymentRobot();
    ResultRobot result = payment
        .amount(42_00)
        .recipient("foo@bar.com")
        .send();
    result.isSuccess();
}
Run Code Online (Sandbox Code Playgroud)

他提供了一个关于如何构造Robot类的概述,并带有显式的isSuccess()响应,并返回了下一个屏幕或当前屏幕的状态的另一个Robot:

class PaymentRobot {
    PaymentRobot amount(long amount) { ... }
    PaymentRobot recipient(String recipient) { .. }
    ResultRobot send() { ... }
}

class ResultRobot { 
    ResultRobot isSuccess() { ... }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 机器人如何与活动/片段进行交互,特别是在何处进行实例化?我希望跑步者在测试中会发生这种情况,但是他的例子似乎暗示了其他情况。该方法看起来可能非常有用,但我看不到如何在实践中实现它,无论是针对单个Activity / Fragment还是针对它们的序列。
  • 如何扩展此方法,以便isSuccess()方法可以处理各种情况。例如,如果我们正在测试登录屏幕,则isSuccess()如何处理各种预期结果,例如:身份验证成功,API网络失败和身份验证失败(例如403服务器响应)?理想情况下,应在Retrofit之后模拟API,并使用端到端UI测试来测试每个结果。

除了Jake的概述演讲之外,我找不到任何实现示例。

android android-testing android-espresso

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

为什么SmsManager在某些设备上需要READ_PHONE_STATE权限而在其他设备上不需要?

该应用程序使用SmsManager发送短信.仅在成功从用户获取SEND_SMS运行时权限后才调用以下方法.该应用针对API 25.

public static void sendSmsTextMessage(Context context, String number, String message) {
    SmsManager sms = SmsManager.getDefault();
    int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.SEND_SMS);
    if (permissionCheck == PERMISSION_DENIED) {
        Timber.e("Permission to send SMS denied");
    } else {
        sms.sendTextMessage(number, null, message, null, null);
    }

}
Run Code Online (Sandbox Code Playgroud)

到目前为止,它已经在所有已经过测试的设备上运行良好.但它现在已经被用在手机上,Logicom L-EMENT 553,当试图在API 23(Marshmallow)上调用sendTextMessage()时,应用程序会爆炸,但是有以下异常:

Exception java.lang.RuntimeException: Failure delivering result
ResultInfo{who=@android:requestPermissions:, request=1, result=-1,
data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has
extras) }} to activity 
{com.myapp.android/com.myapp.android.ui.bet.BetActivity}: 
java.lang.SecurityException: Neither user 10108 nor current process
has android.permission.READ_PHONE_STATE.
Run Code Online (Sandbox Code Playgroud)

为什么在某些设备上需要READ_PHONE_STATE权限,而在发送短信时却不需要其他设备?显然,最好不要求此权限,因为用户提出这种访问级别是一个很大的要求.

这里问题的答案为什么sendTextMessage需要READ_PHONE_STATE权限?建议一些Android版本包含一个请求此权限的错误,但这是或者sendTextMessage()方法是否通过长度限制传递消息,然后继续使用divideMessage()然后请求此权限拆分它?虽然说过我没有看到任何证据,但sendMessage()会自动将长消息拆分成较小的片段并发送它们.

android android-permissions android-sms

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

使用反射读取Kotlin函数注释值?

给定这样的接口方法(Android Retrofit),如何在运行时从 Kotlin 代码中读取注释参数中指定的 URL 路径?

Api定义接口:

@GET("/api/somepath/objects/")
fun getObjects(...)
Run Code Online (Sandbox Code Playgroud)

读取注释值:

val method = ApiDefinition::getObjects.javaMethod
val verb = method!!.annotations[0].annotationClass.simpleName ?: ""
// verb contains "GET" as expected
// But how to get the path specified in the annotation?
val path = method!!.annotations[0].????????
Run Code Online (Sandbox Code Playgroud)

更新1

感谢您的回答。我仍然在挣扎,因为我看不到使用什么类型来执行以下操作:

val apiMethod = ApiDefinition::getObjects
Run Code Online (Sandbox Code Playgroud)

....然后将该函数引用传递给这样的方法(它被重用)

private fun getHttpPathFromAnnotation(method: Method?) : String {
    val a = method!!.annotations[0].message
}
Run Code Online (Sandbox Code Playgroud)

IntelliJ IDE 建议我使用 KFunction5<> 作为函数参数类型(据我所知,它不存在),并且似乎要求我也指定该方法的所有参数类型,这会进行通用调用以获取注释属性不可能。Kotlin 中是否有一个相当于“Method”的类型?一种可以接受任何方法的类型?我尝试了 KFunction,但没有成功。

更新2

感谢您澄清事情。我已经到了这一点:

ApiDefinition(改造接口)

@GET(API_ENDPOINT_LOCATIONS)
fun getLocations(@Header(API_HEADER_TIMESTAMP) timestamp: String,
                 @Header(API_HEADER_SIGNATURE) encryptedSignature: String,
                 @Header(API_HEADER_TOKEN) …
Run Code Online (Sandbox Code Playgroud)

android kotlin retrofit2 kotlin-reflect

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