小编Mik*_*mov的帖子

更改CardView阴影颜色

这个问题在很多时候被问过,但我仍然找不到解决这个问题的好方法.

为什么我需要这样做?好吧,因为项目我和我的团队开发有iOS风格.

我尝试了什么?

  1. 9.pathch阴影生成器,但9.pathes本质上是pngs,它给了我没有灵活性,如果我将使用这种方法,我应该编辑边缘到处.
  2. 它支持自定义阴影的碳库,它们被绘制到视图边框之外,但是当库不为圆角绘制阴影时,存在关于圆角矩形的问题.
  3. 使用旧的CardView实现并覆盖其阴影颜色,但它被绘制在卡片边界内,因此它不是选项.

那么有没有办法改变CardView的阴影颜色,只需对所有布局文件进行最少的编辑,并在视图外部绘制阴影,就像原始的CardView一样?

android shadow android-view android-cardview android-elevation

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

如何在资源文件夹中获取FileInputStream到File

我知道如何使用从目录中AssetManager读取a ,但对于我的特殊用例,我需要一个.我需要一个具体的原因是因为我需要通过调用从中获取对象.Fileres/rawInputStreamFileInputStreamFileInputStreamFileChannelgetChannel()

这是我到目前为止的代码,它从一个读取数据(在我的例子中是一个基元列表)File:

public static int[] loadByMappedBuffer(Context context, String filename) throws IOException{
    FileInputStream fis = context.openFileInput(filename);
    FileChannel ch = fis.getChannel();

    MappedByteBuffer mbuff = ch.map(MapMode.READ_ONLY, 0, ch.size());
    IntBuffer ibuff = mbuff.asIntBuffer();

    int[] array = new int[ibuff.limit()];
    ibuff.get(array);

    fis.close();
    ch.close();

    return array;
} 
Run Code Online (Sandbox Code Playgroud)

我试图File从一个创建Uri,但这只会导致FileNotFoundException:

Uri uri = Uri.parse("android.resource://com.example.empty/raw/file");
File file = new File(uri.getPath());
FileInputStream fis = new FileInputStream(file);
Run Code Online (Sandbox Code Playgroud)

有没有一种方法,我可以得到FileInputStream一个Fileres/raw目录中?

java android nio android-resources

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

针对每个存储库方法的Android Clean Architecture UseCase?

我们是否需要UseCasesRepository域层中的接口创建每个方法?

例如,假设我有这样的Repository接口

interface ThingRepository {
    void create(Thing thing);
    void delete(Thing thing);
    List<Thing> readAll();
    int size();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,有一种size()方法可以返回数据库或文件中的记录数,无论如何.这种方法非常快.我想UseCase这个方法没有必要,因为它不会阻塞UI线程并且可以同步执行.

所以,当你创建UseCases时,你可以解释我.基本上是否有任何UseCase创作规则?

对不起,如果这个问题存在一些误解.

提前致谢 ;)

我也在github上的Android-CleanArchitecture repo上打开了同样的问题,但没有人回答它,这就是我在这里问的原因.

android clean-architecture

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

FileChannel 在资产文件夹中返回错误的文件大小

我正在尝试File使用FileInputStream.

这就是我创建的方式FileInputStream

AssetManager assetManager = getAssets();
AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName);
FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)

之后,我试图从File这样的读取数据:

FileChannel fileChannel = inputStream.getChannel();

MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
IntBuffer intBuffer = mappedByteBuffer.asIntBuffer();

int[] array = new int[intBuffer.limit()];
intBuffer.get(array);

inputStream.close();
fileChannel.close();
Run Code Online (Sandbox Code Playgroud)

但这不起作用。出于某种原因,fileChannel.size()返回了一个巨大的数字。我有一个正好 13 个字节长的测试文件,但fileChannel.size()返回 1126498!此外,如果我忽略大小并开始读取返回的字节,则根本不匹配我的测试文件!

那么这里发生了什么?有没有办法解决这个问题?

java android assets fileinputstream

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

ProGuard 不会对对象的方法进行混淆

为了了解ProGuard它是如何工作的,我创建了一个小Android示例,添加了一些示例jar,编写了几行代码,启用ProGuard等等。

接下来是我的 ProGuard 选项

-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...);
}
-optimizationpasses 5
-optimizations !class/unboxing/enum
Run Code Online (Sandbox Code Playgroud)

因此,在对我的 APK 名称进行逆向工程后,所有Object方法(例如toString()hashCode()、 )equals()保持不变。除了Object的方法之外,Externalizable方法的名称也保留

那么您知道为什么会发生这种情况吗?是否可以解决?

obfuscation android proguard

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

Java将布尔数组存储在文件中并快速读取

我需要在文件中存储包含 80,000 个项目的布尔数组。我不在乎节省多少时间,我只对数组的加载时间感兴趣。我没有尝试通过 DataOutputStream 存储它,因为它需要访问每个值。

我试图通过 3 种方法来做到这一点,例如:

  1. 序列化布尔数组
  2. 使用 BitSet 而不是布尔数组序列化它
  3. 将布尔数组转换为字节数组,其中 1 为真,0 为假,并通过 FileChannel 使用 ByteBuffer 写入

为了测试通过这些方法读取文件,我在循环中运行了每种方法 1,000 次。所以我得到了如下所示的结果:

  1. 布尔数组的反序列化需要 574 毫秒
  2. BitSet 的反序列化 - 379 毫秒
  3. 通过 MappedByteBuffer 从 FileChannel 获取字节数组 - 170 毫秒

第一种方法和第二种方法太长了,第三种方法可能根本就不是方法。

也许有最好的方法来完成它,所以我需要你的建议

编辑

每个方法运行一次

  1. 13.8
  2. 8.71
  3. 6.46 毫秒

java arrays io boolean

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

Android ViewTreeObserver.OnGlobalLayoutListener的麻烦

我正在使用ViewTreeObserver.OnGlobalLayoutListenerin onCreate()方法来获取布局的宽度。它很好用,但是当我在onGlobalLayout()回调更改中使用变量时,请不要将其保留在外部。

例如,当我在“活动”字段中保存布局的宽度时,它会在onGlobalLayout()方法外返回上一个值或默认情况下的值(在我的情况下为0)。当我更改变量的引用时,方法外它们将为null。

layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
    width = layout.getWidth(); // width - activity's field
    Log.d("myLogs", width); //return rigth value
}
});
Log.d("myLogs", width); //return 0
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理,也许我需要Layout以另一种方式获得宽度。

提前致谢)

android view

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

Java方法包含另一个抛出异常的方法

我有公共方法add(String)调用私有方法inspectSequence(String)来检查String是否有效.

如果传递String有效,则此方法返回数组,如果它无效则抛出方法IllegalArgumentException

代码是下一个

public void add(String sequence) throws IllegalArgumentException{
  inspectSequence(sequence);
}

private int[] inspectSequence(String sequence){
  int[] array;
  //some actions
  if(<some condition>) throw new IllegalArgumentException("description");
  return array;
}
Run Code Online (Sandbox Code Playgroud)

所以在情况下,当无效String传递给add方法输出时,下一步是:

java.lang.IllegalArgumentException: description
at inspectSequence
at add
Run Code Online (Sandbox Code Playgroud)

但是我不希望用户知道私有inspectSequence方法,因为这是实现细节,对吧?

那么在那种情况下我能做些什么呢?在这里抛出未经检查的异常是一个好主意吗?

而且是一个好主意,抛出异常中inspectSequence的方法,或者我应该返回null提供时String是无效的,然后检查返回结果add的方法,并根据它扔还是不扔异常?

java unchecked-exception

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