小编Ant*_*hyn的帖子

SimpleDateFormat.getTimeInstance忽略24小时格式

在我的应用程序中,我可以选择暂停执行一段时间.我想显示执行将恢复的时间,包括秒,我希望时间字符串根据设置进行格式化.这是我提出的代码:

long millis = getResumeTime();
String timeString;
timeString = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM).format(millis);
Run Code Online (Sandbox Code Playgroud)

这确实产生了一个带有秒的格式化字符串,但它返回AM/PM格式的时间,即使我在设置中设置了24小时时间格式.它甚至更有趣,因为系统托盘中的时间使用24小时格式正确格式化.

我尝试使用DateFormat.getTimeFormat,如下所示:

long millis = getResumeTime();
String timeString;
java.text.DateFormat df = android.text.format.DateFormat.getTimeFormat(this);
timeString = df.format(millis);
Run Code Online (Sandbox Code Playgroud)

但结果字符串不包含秒,我没有看到包含它们的方法.

我在Android 4.2模拟器上运行此代码.我在这里错过了什么吗?SimpleDateFormat不知道12/24小时设置吗?如果没有,我如何以系统格式获得时间(包括小时,分钟和秒)的字符串表示?

java time android time-format

6
推荐指数
3
解决办法
9685
查看次数

Android尝试验证主机,尽管android:autoVerify ="false"

在我的应用程序中,我有3个活动,MainActivity,SecondaryActivity和TertiaryActivity.我希望SecondaryActivity成为Android 6上特定域的默认应用程序链接处理程序,如本指南中所述.同时,我希望另一个活动TertiaryActivity能够处理来自另一个域的链接,但不能成为默认处理程序,因为我不拥有该域.这是我的AndroidManifest来说明:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.antonc.applinktest"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity android:name=".SecondaryActivity"
                  android:label="@string/app_name"
                  android:theme="@style/AppTheme.NoActionBar">
            <intent-filter android:autoVerify="true"> <!-- TRUE -->
                <data android:scheme="https"
                      android:host="secondary.com"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>
        </activity>

        <activity android:name=".TertiaryActivity"
                  android:label="@string/app_name"
                  android:theme="@style/AppTheme.NoActionBar">
            <intent-filter android:autoVerify="false"> <!-- FALSE -->
                <data android:scheme="https"
                      android:host="tertiary.com"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>
        </activity>
    </application>

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

我阅读了这篇关于应用程序链接的详尽指南,解释了Android上应用程序链接处理和应用程序验证的机制,这里是我在logcat中看到的与应用程序验证相关的消息:

03-25 17:54:45.640 1481-1481/com.google.android.gms D/IntentFilterVerificationReceiver: Received ACTION_INTENT_FILTER_NEEDS_VERIFICATION.

03-25 17:54:45.644 …
Run Code Online (Sandbox Code Playgroud)

android intentfilter

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

为什么传递原始vararg参数时Kotlin传播运算符需要toTypedArray()?

我有一个100%用Kotlin编写的Android应用。

在我的单元测试课程中,我有2个测试观察者,一个观察整数,另一个观察对象:

val conversationCountObserver: TestObserver<Int>
val conversationObserver: TestObserver<Conversation>
Run Code Online (Sandbox Code Playgroud)

对于每一个我想做一些基本的断言,例如检查是否没有错误并检查观察到的值。我决定编写一个通用方法,该方法可以对RX TestObserver类中的元素列表执行许多断言,并编写2个代理方法,以通过Kotlin * spread运算符传递值的相应观察者和变量:

private fun thenConversationsNotified(vararg conversations: Conversation) {
    thenTestObserverNotified(conversationObserver, *conversations)
}

private fun thenConversationCountNotified(vararg counts: Int) {
    thenTestObserverNotified(conversationCountObserver, *counts)
}

private fun <T>thenTestObserverNotified(observer: TestObserver<T>, vararg elements: T) {
    observer.assertNoErrors()
    elements.forEachIndexed { index, element ->
        observer.assertValueAt(index, element)
    }
}
Run Code Online (Sandbox Code Playgroud)

thenConversationsNotified()方法工作正常,但是thenConversationCountNotified()显示错误:

在此处输入图片说明

在此处输入图片说明

在阅读Kotlin文档(http://kotlinlang.org/docs/reference/java-interop.html#java-arrays)之后,我意识到原始类型的vararg实际上创建了一个IntArray对象而不是一个Array,这是作为一个Java互操作的解决方案,该方法对待原语的变量与对象的对待不同。所以我必须用.toTypedArray()重写thenConversationCountNotified:

private fun thenConversationCountNotified(vararg counts: Int) {
    thenTestObserverNotified(conversationCountObserver, *counts.toTypedArray())
}
Run Code Online (Sandbox Code Playgroud)

为什么散布运算符不能以与对象数组相同的方式在原始数组类上工作?有什么办法可以删除对.toTypedArray()的调用?

PS注意,在上面的链接中,它们声明了返回IntArray的intArrayOf(1,2,3),并且在将其传递给其他方法时,散布运算符可以正常工作。因此,传播算子确实适用于IntArray类。Kotlin文档中的示例与我的方法之间的唯一区别是,我在一个方法中有2个参数,一个是具体参数,另一个是vararg。

generics kotlin rx-java

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

BroadcastReceiver:以编程方式设置android:process

我希望我的应用程序检测外部存储状态何时发生变化.最初在我的AndroidManifest中定义了一个BroadcastReceiver.在这里我可以像这样设置android:processandroid:exported属性:

    <receiver android:name=".StorageStateReceiver" android:process=":storage_state" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
            <action android:name="android.intent.action.MEDIA_MOUNTED" />
            <action android:name="android.intent.action.MEDIA_EJECT" />
            <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
            <data android:scheme="file" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

然后我意识到我只在一个Activity中使用这个接收器,因此在应用程序启动时不需要实例化它,而是我可以在代码中以编程方式定义它.这就是我想出的:

BroadcastReceiver StorageStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Do what needs to be done
        }
    };
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
filter.addDataScheme("file");
getApplicationContext().registerReceiver(StorageStateReceiver, filter);
Run Code Online (Sandbox Code Playgroud)

我把这段代码放在我活动的onCreate()方法中.

但我找不到process从代码设置的方法.我已经阅读了有关BroadcastReceiver和Context类的文档.BroadcastReceiver似乎没有托管任何允许您定义进程名称的方法.另一方面,registerReceiver()可以加入两个额外的参数:String broadcastPermission,Handler scheduler.处理程序听起来很有希望,但我找不到一个Handler构造函数,它可以接受一个字符串形式的进程名称.我觉得我没有想法了.有没有办法以编程方式设置进程名称?

storage android broadcastreceiver

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

Android Wear - 使用指定的纯色作为通知背景

出于某种原因,我无法让这个简单的概念适用于Android的佩戴.我希望Wear上的通知具有纯色背景和我选择的颜色.这就是我想要做的:

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder
            .setContentTitle("title")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentText("Text")
            .setColor(Color.YELLOW);

    Notification notification = builder.build();
    notificationManager.notify(123456, notification);
Run Code Online (Sandbox Code Playgroud)

如您所见,我将通知颜色设置为黄色.这确实将通知背景设置为手机上的黄色.但出于某种原因,我在Android Wear上看到的通知的背景颜色是绿色的.请参阅随附的屏幕截图.

在此输入图像描述

在此输入图像描述

我尝试使用WearableExtender扩展通知构建器,但它没有类似"setColor"的方法,只有"setBackground".为什么Wear会忽略指定的通知颜色?它从哪里采取绿色背景颜色?如何覆盖该颜色?

android android-notifications wear-os

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

在java中使用泛型参数覆盖Kotlin方法 - 方法冲突

我的团队正在为我们的 Android 应用程序迁移到 Kotlin,但我们仍然有很多遗留的 Java 代码,这有时会导致奇怪的代码问题。这是那些奇怪的案例之一。

我有一个 Kotlin 类,称之为 MyInterface:

interface MyInterface {
    fun onMyObjectList(myObjectList: List<MyObject>)
}
Run Code Online (Sandbox Code Playgroud)

我需要在用 Java 编写的 Activity 中实现此接口:

class MyActivity implements MyInterface {
...
}
Run Code Online (Sandbox Code Playgroud)

下面是我在 Java 中实现重写方法的方法:

@Override
public void onMyObjectList(@NotNull List<MyObject> objectList) {

}
Run Code Online (Sandbox Code Playgroud)

我确实想将 aList<MyObject>作为参数,但 IDE 抛出错误

onMyObjectList(List<MyObject> objectList)在 MyActivity 中与onMyObjectList(List<? extends MyObject> objectList)在 MyInterface 中发生冲突。两种方法都有相同的擦除,但都不覆盖另一个

我不能使用 aList<? extends MyObject>作为参数,因为我将它进一步传递给需要 a 的方法List<MyObject>。如何配置我的 Kotlin 接口,以便它实际使用List<MyObject>而不是List<? extends MyObject>在 Java 中被覆盖?

java android interop kotlin

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

如何在颤振测试中验证 Switch 小部件的状态?

是否有可以验证Switch小部件状态的颤动匹配器?我可以使用find.byKey(myKey). 因此,如果有像这样的匹配器isToggled(state),我会通过在我的测试中编写如下内容来验证我的小部件的状态:

expect(find.byKey(myKey), isToggled(true))
Run Code Online (Sandbox Code Playgroud)

有这样的匹配器吗?如何验证切换状态?

user-interface dart flutter

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

XmlPullParser.getInputEncoding()在API11 +和Android11之前版本上的不同行为

我正在为我的android应用程序开发一项新功能,以启用数据备份和还原。我正在使用XML文件备份数据。这是一段代码,用于设置输出文件的编码:

XmlSerializer serializer = Xml.newSerializer();
FileWriter fileWriter = new FileWriter(file, false);
serializer.setOutput(fileWriter);
serializer.startDocument("UTF-8", true);
[... Write data to the file....]
Run Code Online (Sandbox Code Playgroud)

这就是我尝试从XML文件导入数据的方式。首先,我检查编码是否正确:

XmlPullParser parser = Xml.newPullParser();
FileReader reader = new FileReader(file);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(reader);
if(!"UTF-8".equals(parser.getInputEncoding())) {
    throw new IOException("Incorrect file encoding");
}
[... Read data from the file....]
Run Code Online (Sandbox Code Playgroud)

在这里,我遇到了一个问题。此代码在Android 2.3.3(设备和仿真器)上均能正常工作,该编码已正确检测为“ UTF-8”。但是在API11 +版本(蜂窝,ICS,JB)上会引发异常。当我在调试模式下运行此命令时,我可以看到parser.getInputEncoding()返回null。我检查了在2.3.3和更高版本上生成的实际XML文件,它们具有完全相同的标题:<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>为什么getInputEncoding()在API11 +上返回null?

其他发现:

我发现有一种方法可以使用FileInputStream而不是FileReader像这样来正确检测API11 +设备上的文件编码:

XmlPullParser parser = Xml.newPullParser();
FileInputStream stream = new FileInputStream(file);
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(stream, …
Run Code Online (Sandbox Code Playgroud)

xml encoding android filereader fileinputstream

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