【问题标题】:String[] array not working properlyString[] 数组无法正常工作
【发布时间】:2017-02-03 06:05:01
【问题描述】:

我的 String[] 数组有问题。我从 Here 参考了这个问题 &Here

但是,我仍然没有从链接中找到任何解决方案。

我想要什么:

我正在开发一个自定义相机应用程序。我有一个文件夹,我在其中保存一个捕获的图像。此外,我有 1 个 ImageView。当我的应用启动时,文件夹的图像 [或位图] 被设置到该 ImageView 中(始终将文件夹的第一个图像设置为 ImageView)。

以下是我的代码。

private void loadImageInImageView() {
        Uri[] mUrls;
        String[] mFiles = new String[0];

        File file = new File(android.os.Environment.getExternalStorageDirectory(), "CameraApp/Images");

        File[] imageList = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File file, String name) {
                return ((name.endsWith(".jpg")) || (name.endsWith(".png")) || (name.endsWith(".mp4")));
            }
        });

        if (mFiles.length >= 0) {
            Toast.makeText(this, "No Captured Images", Toast.LENGTH_SHORT).show();
        } else {
            mFiles = new String[imageList.length];

            for (int i = 0; i < imageList.length; i++) {
                mFiles[i] = imageList[i].getAbsolutePath();
            }
            mUrls = new Uri[mFiles.length];

            for (int i = 0; i < mFiles.length; i++) {
                mUrls[i] = Uri.parse(mFiles[i]);
                imgBtnThumbnail.setImageURI(mUrls[i]);
            }
        }
    }

在上面的代码中[当文件夹为空时]:

  1. 当我设置if (mFiles.length &gt; 0)

    它显示了一个错误

错误:尝试获取空数组的长度

  1. 当我设置if (mFiles.length &gt;= 0)

    然后它显示我和上面的错误一样。

  2. 当我设置if (mFiles == null)

    它也不起作用,因为我已经在上面的代码中初始化了 String[]。

    String[] mFiles = new String[0]; 因此它也不起作用。

当我有一些图像时,它工作正常。因为它执行了 else 部分。 我该怎么办?每当我的文件夹为空时,它就会向我显示一个 Toast。否则我的 else 代码将被执行。

任何帮助将不胜感激。

【问题讨论】:

  • 您正在初始化大小为 0 的 mFiles 数组。 String[] mFiles = new String[0]
  • 是的……我是这样做的……我读到了数组初始化应该从 0 开始。
  • ^:D。这是数组的大小。如果使用new String[100] 初始化数组,它将从0 开始并以99 结束。
  • if (mFiles.length &gt;= 0) { - 你正在检查一些奇怪的东西。数组的长度始终为非负数。但是,在这种情况下,它就更奇怪了,因为您检查了mFiles 的大小,而mFiles 在您创建它之后无法更改。我想你想检查imageList.length == 0
  • 让它为空。检查是否为 null 然后显示 toast 否则对图像做一些事情

标签: android arrays string


【解决方案1】:
File[] imageList = file.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File file, String name) {
            return ((name.endsWith(".jpg")) || (name.endsWith(".png")) || (name.endsWith(".mp4")));
        }
    });

if (imageList.length = 0) {
        Toast.makeText(this, "No Captured Images", Toast.LENGTH_SHORT).show();
    } else {
        String[] mFiles = new String[imageList.length];

        for (int i = 0; i < imageList.length; i++) {
            mFiles[i] = imageList[i].getAbsolutePath();
        }
        mUrls = new Uri[mFiles.length];

        for (int i = 0; i < mFiles.length; i++) {
            mUrls[i] = Uri.parse(mFiles[i]);
            imgBtnThumbnail.setImageURI(mUrls[i]);
        }
    }

【讨论】:

  • 这里我用的是什么.....if (imageList.length = 0)...我认为这里 == .in if()
  • @faranjit..谢谢伙计,你的答案也正常工作....但我不能标记 2 个问题..这就是为什么投票。
【解决方案2】:

如果您想要的功能在 imageList 的大小大于零时有效,请尝试以下代码。

private void loadImageInImageView() {

    File file = new File(android.os.Environment.getExternalStorageDirectory(), "CameraApp/Images");

    File[] imageList = file.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File file, String name) {
            return ((name.endsWith(".jpg")) || (name.endsWith(".png")) || (name.endsWith(".mp4")));
        }
    });

    // conditional operator [ ? : ]
    // value = (experssion) ? value if true : value if false
    // ref : https://www.tutorialspoint.com/java/java_basic_operators.htm
    int imgLength = imageList == null ? 0 : imageList.length;

    if(imgLength > 0)
    {
        String[] mFiles =  new String[imgLength];
        Uri[] mUrls = new Uri[imgLength];

        //merge for condition
        for (int i = 0; i < imgLength; i++) {
            mFiles[i] = imageList[i].getAbsolutePath();
            mUrls[i] = Uri.parse(mFiles[i]);
            imgBtnThumbnail.setImageURI(mUrls[i]);
        }
    }
    else
    {
        Toast.makeText(this, "No Captured Images", Toast.LENGTH_SHORT).show();
    }
}

【讨论】:

  • Ethan Choi....您的回答非常酷,效果也很好...就像魅​​力一样的作品...谢谢您节省了我的时间。
  • 你能告诉我这行的意思吗..... int imgLength = imageList == null ? 0 : imageList.length;
  • 如果我使用单个 for() 条件而不是 2 个 for() 条件...因为两者是相同的...?
  • int imgLength = imageList == null ? 0 : imageList.length 的意思是如果 imageList 为 null 则 imgLength 为零,否则 image.length
  • 那么我可以将两个条件代码放在一个..?
【解决方案3】:

不要初始化 mFiles。在添加一些数据的那一刻初始化它。 为了检查它是否不为空,请使用:

if (mFiles != null && mFiles.length > 0) {
    ...
}

【讨论】:

  • @reaven...我按照你说的做了.....但是当我没有初始化 mFiles 时..Android Studio 在 mFiles 上方给了我红线....并说变量 mFiles 可能不会已初始化。
  • 所以先用null初始化:String[] mFiles = null;那样就不会显示红线了。
【解决方案4】:
private void loadImageInImageView() {
        Uri[] mUrls;
        File[] imageList

        File file = new File(android.os.Environment.getExternalStorageDirectory(), "CameraApp/Images");

        imageList = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File file, String name) {
                return ((name.endsWith(".jpg")) || (name.endsWith(".png")) || (name.endsWith(".mp4")));
            }
        });

        if (imagelist==null && imageList.length == 0) {
            Toast.makeText(this, "No Captured Images", Toast.LENGTH_SHORT).show();
        } else {

            for (int i = 0; i < imageList.length; i++) {

                imgBtnThumbnail.setImageURI(Uri.parse(imageList[i].getAbsolutePath()););
            }
        }
    }

试试这个; 但是由于 for 循环,您的图像会不断变化;

【讨论】:

  • java.lang.RuntimeException:无法启动活动 ComponentInfo{com.devkrushna.camerademo/com.devkrushna.camerademo.MainActivity}:java.lang.NullPointerException:尝试获取空数组的长度.. ......向我展示了错误
  • 可能你的imageList 为空
  • 检查一下。我已经编辑了它。但是您的图像列表为空@Sagar Aghara
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2015-11-07
  • 2013-12-13
  • 1970-01-01
相关资源
最近更新 更多