小编Nat*_*tix的帖子

在try-with-resources块中管理多个链式资源的正确习惯用法?

当仅使用一个资源时,Java 7 try-with-resources语法(也称为ARM块(自动资源管理))很好,简短而直接AutoCloseable.但是,当我需要声明彼此依赖的多个资源时,我不确定什么是正确的习惯用法,例如a FileWriter和a BufferedWriter包装它.当然,这个问题涉及AutoCloseable包装某些资源的任何情况,而不仅仅是这两个特定的类.

我提出了以下三种选择:

1)

我见过的天真的习惯是只声明ARM管理变量中的顶级包装器:

static void printToFile1(String text, File file) {
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
        bw.write(text);
    } catch (IOException ex) {
        // handle ex
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好而且简短,但它已被打破.由于底层FileWriter未在变量中声明,因此永远不会在生成的finally块中直接关闭它.它只能通过close包装方法关闭BufferedWriter.问题是,如果从bw构造函数抛出异常,close则不会调用它,因此底层FileWriter 将不会被关闭.

2)

static void printToFile2(String text, File file) {
    try (FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw)) {
        bw.write(text); …
Run Code Online (Sandbox Code Playgroud)

java try-with-resources

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

ListView的最后一项之后的分隔符(分隔符)

当我创建一个只有ListView的简单布局时,在最后一项之后没有显示分隔符,这看起来有点难看.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,如果我在列表视图下添加另一个视图并设置listview的属性,我发现在最后一个项目后面会显示一个分隔符android:layout_above.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/bottom"
        android:layout_alignParentTop="true" />

    <TextView
        android:id="@+id/bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@android:color/holo_blue_dark"
        android:text="Bottom" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

为什么listview的行为如此?如何在仅包含列表视图的布局中的最后一项之后获取分隔符?

android android-listview

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

DialogFragment中未调用OnCancelListener

我有一个简单的AlertDialog显示一些项目的列表,单击其中一个项目后,单击的项目将传递回封闭项目Activity.我还想在用户取消对话框时使用后退按钮执行一些默认处理- 更具体地说,我想在这种情况下将空字符串传递给活动.

但是,如果我将对话框放在DialogFragment(来自兼容包)中,OnCancelListener 则在使用后退按钮关闭对话框时不会调用该对话框.我究竟做错了什么?

public class SelectItemDialog extends DialogFragment {

    public interface Callback {
        void onItemSelected(String string);
    }

    private static final String ARG_ITEMS = "items";

    private Callback callback;

    public static SelectItemDialog fromItems(Collection<String> items) {
        SelectItemDialog fragment = new SelectItemDialog();
        fragment.setArguments(newArguments(items));
        return fragment;
    }

    private static Bundle newArguments(Collection<String> items) {
        Bundle arguments = new Bundle();
        arguments.putStringArray(ARG_ITEMS, items.toArray(new String[items.size()]));
        return arguments;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        callback …
Run Code Online (Sandbox Code Playgroud)

java android android-alertdialog android-dialogfragment

22
推荐指数
3
解决办法
2万
查看次数

Android应用中的开源库归因

一些Android应用程序(尤其是Google的应用程序)的一个部分包含应用程序中使用的开源库列表,以及每个应用程序的许可证全文.这通常涉及Apache许可证,它在大多数常见的Android库中使用,例如ActionBarSherlock,ViewPagerIndicator,Guava等.

  • 为了遵守(Apache)许可条款,是否必须包含此类归属?

  • 这部分应该怎么样?如果多个库使用相同的许可证,是否有必要为每个库复制许可证的文本?

  • 是否有必要包括许可证的全文,或者是否足够的唯一版权声明(参见附录:http://www.apache.org/licenses/LICENSE-2.0)?

  • 官方的Android开发人员指南是否包含有关此主题的一些信息(我找不到任何信息)?

android licensing open-source

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

如何格式化给定语言环境的双精度值和小数位数?

我如何使用NumberFormat格式化double给定的值Locale(默认语言环境就足够了)和给定的小数位数?

例如,我有以下值:

double d1 = 123456.78;
double d2 = 567890;
Run Code Online (Sandbox Code Playgroud)

我想以下列方式打印它们,例如使用美国语言环境和2个小数位:

123,456.78
567,890.00
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我实际上并不关心舍入模式,因为这些双值是从BigDecimal给定比例的a 获得的,因此它们的小数位数总是小于或等于我想要打印的小数位数.

编辑:

为了使事情更清楚,问题是我想以依赖于语言环境的方式显示钱,但是具有固定数量的小数位.上面的示例显示了如果系统区域设置是如何格式化值en_US.现在假设,系统区域设置是cs_CZ(捷克语),因此应以这种方式格式化相同的数字:

123 456,78
567 890,00
Run Code Online (Sandbox Code Playgroud)

现在,如何设置NumberFormat以始终显示2个小数位,但是根据当前区域设置显示千位分隔符和小数点?

java number-formatting

14
推荐指数
2
解决办法
3万
查看次数

Theme.Sherlock.Light.DarkActionBar中的隐形ActionMode项目图标

当使用Theme.Sherlock.Light.DarkActionBar(或Theme.Holo.Light.DarkActionBar没有区别)时,例如在选择文本时出现的ActionMode(或"上下文ActionBar")默认情况下与标准黑暗主题中的样式相同,即带有光的深蓝色行动图标.

但是,当您尝试在对话框中选择文本时(在此主题中为浅色调,与黑色ActionBar形成对比),将显示与Light主题(白色背景)中样式相同的ActionMode.问题是,它的动作图标不是应该是暗的,而是亮的,使它们实际上不可见.

在此输入图像描述

这看起来好像背景是从光主题中获取的(因为光对话框),但是图标是从黑暗主题中拍摄的.这是Light.DarkActionBar主题中的错误吗?我能为此做些什么吗?

android android-theme

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

如何在Gradle中设置Kotlin源编码?

使用Gradle构建Java或Groovy时,可以像这样定义源代码编码:

compileJava {
    options.encoding = 'UTF-8'
}

compileTestJava {
    options.encoding = 'UTF-8'
}

compileGroovy {
    groovyOptions.encoding = 'UTF-8'
}

compileTestGroovy {
    groovyOptions.encoding = 'UTF-8'
}
Run Code Online (Sandbox Code Playgroud)

但是,与Kotlin类似的方法不起作用:

compileKotlin {        
    kotlinOptions.jvmTarget = '1.8'
    kotlinOptions.encoding = 'UTF-8'
}
Run Code Online (Sandbox Code Playgroud)

它失败并出现错误:

* What went wrong:
A problem occurred evaluating root project 'backend'.
> No such property: encoding for class: org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
Run Code Online (Sandbox Code Playgroud)

我实际上找不到任何关于Kotlin编译器编码的信息.这是否意味着没有这样的选择?它使用什么charset,UTF-8,系统默认(我希望不是)?

character-encoding gradle kotlin

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

缓存方法导致不可变对象

假设我有一个表示复数的简单接口,其实例将是不可变的.为了简便起见,我省略了明显的plus,minus,timesdivide方法会简单地创建并返回一个新的不可变的实例.

public interface Complex {

    double real();

    double imaginary();

    double absolute();

    double angle();

}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,将此实现为不可变类的最佳方法是什么?最简单直接的"我关心性能仅在问题出现时"的方法是将实部和虚部存储为最终字段,并计算每次调用这些方法时的绝对值和角度.这使得类变得小而简单,但显然最后两个方法每次都返回相同的结果.

public final class NonCachingComplex implements Complex {

    private final double real;
    private final double imaginary;

    public NonCachingComplex(double real, double imaginary) {
        this.real = real;
        this.imaginary = imaginary;
    }

    @Override public double real() {
        return real;
    }

    @Override public double imaginary() {
        return imaginary;
    }

    @Override public double absolute() {
        return Math.sqrt((real * real) + (imaginary * imaginary)); …
Run Code Online (Sandbox Code Playgroud)

java caching immutability

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

Eclipse Juno - 更新后工具栏中的间隙

我刚刚将Eclipse IDE for Java Developers插件更新为版本1.5.1.20121004-1506,导致主工具栏中存在荒谬的空白:

在此输入图像描述

是的,我知道将Eclipse更新为Indigo基本上是一个坏主意,因为每个新版本似乎越来越差,但除了重新安装一些旧版本之外,有没有任何简单的方法来解决这个问题(我真的不想丢失我的设置和安装插件)?这个bug是否在某处被追踪?

eclipse-juno

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

所有实例都相等的类的HashCode实现

假设我有一个类,其中所有实例都被认为是相等的.典型的用例是针对没有任何状态但只表现为函数的类.

public class ToStringFunction implements Function<Object, String> {

    @Override
    public String apply(Object o) {
        return o.toString();
    }

    @Override
    public boolean equals(Object o) {
        return o instanceof ToStringFunction;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,应该如何实现hashCode方法?当然,为了遵守equals/hashCode合约,它需要是一个常量值.但那应该是什么价值?如果使用诸如0或1之类的某些微不足道的值,则可能导致与其他类似类的冲突.

所以这似乎归结为这个问题:如何实现一个对于给定类可能是唯一的hashCode,但对于它的所有实例都是相同的.

我想出了这两个想法.你觉得怎么样,他们是否理智?

@Override
public int hashCode() {
    return ToStringFunction.class.hashCode();
}

@Override
public int hashCode() {
    return "ToStringFunction".hashCode();
}
Run Code Online (Sandbox Code Playgroud)

java equality hashcode

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