Android Hello GridView Учебник не будет отображать изображения - PullRequest
13 голосов
/ 24 июля 2011

Первый постер!

Я новичок в разработке для Android и без проблем следую учебным пособиям Google HelloView ... до учебного пособия HelloGridView. По некоторым причинам я не могу получить изображения для отображения, только черный фон. Первоначально я следовал этому уроку:

http://developer.android.com/resources/tutorials/views/hello-gridview.html

но перешел к этому почти идентичному:

http://developer.android.com/guide/tutorials/views/hello-gridview.html

, чтобы устранить некоторые дополнительные сложности, удалив код OnItemClickListener и сузив мои возможные проблемные области. Мой код точно такой же, как предоставленный код, буквально скопированный и вставленный. Я даже скачал исходные файлы примеров из учебника и поместил их в папку res \ drawable, и код R, похоже, успешно их распознал и соответствующим образом обновил сгенерированный код. Я использую Android target 1.5 и пробовал эту программу как на своем Droid X, так и на эмуляторе Android. У меня есть все мои импорта и код компилируется и работает нормально. Тем не менее, моя деятельность отображает только черный экран; изображения не отображаются. Когда я нажимаю на черный фон, появляются оранжевые квадраты там, где должны быть изображения. Я нашел одну или две публикации, в которых упоминалась эта проблема, но она всегда была связана с более крупной, более очевидной проблемой и никогда не решалась. Я перечислю свой код и LogCat ниже для справки.

Я заметил, что мой LogCat упоминал:

WARN/ImageView(364): Unable to find resource: 2130837507

что привело меня к этой теме: Почему setImageResource ничего не отображает? подробное описание возможного обходного пути с использованием setImageDrawable вместо setImageResource. Я реализовал это, используя следующую строку кода:

imageView.setImageDrawable(mContext.getResources().getDrawable(mThumbIds[position]));

однако, это просто привело к исключению Resources $ NotFoundException, которое приводило к сбою моего кода (также задокументировано ниже).

В заключение
Я считаю, что учебник по Android не должен требовать обходного пути, поэтому я предполагаю, что у меня возникли какие-то проблемы с конфигурацией. После нескольких часов поисков и попыток я не нашел решения, поэтому решил, что оно требует некоторого обсуждения. Кроме того, учитывая, что это мой первый пост, пожалуйста, дайте мне знать, если вы видите какие-либо вопиющие ошибки. Я заранее прошу прощения за предстоящий Wall-O-код, хотя я думаю, что слишком мало данных может быть хуже, чем слишком много. : D

Спасибо, ребята!

MarnBeast


UPDATE
Я попытался использовать R.drawable.icon в моих mThumbIds, чередуя это и одну из моих картинок. Ни одна из картинок не обнаружилась, но значки появились. Затем я попробовал версию моей картинки в формате .png, но это тоже не сработало. Я скопировал изображение icon.png и отредактировал его в виде краски (поместил усы на андроидного парня: D) и сохранил его как dummyicon.png. Я чередовал это и значок, но это тоже не сработало. Наконец, я избавился от всех ссылок на значки и просто использовал свое изображение в формате png, но, как ни странно, при запуске ВСЕ изображения показывались как значки, хотя я не ссылаюсь на них в mThumbIds! Это отличается от предыдущего поведения, когда вообще ничего не отображалось. Я поменял пару на dummyicon, и при запуске эти изображения просто не появлялись / были просто черными. Все остальные изображения (одно преобразованное в png изображение, повторенное в mThumbIds) по-прежнему отображаются в виде значков.

Наконец, я снова заменил мои преобразованные ссылки на изображения в формате png на значок, чередуя между значком и dummyicon, и теперь ни один из них не появился - снова просто черный экран. Таким образом, кажется, что dummyicon и icon оба не дают ничего, когда ссылаются, только черное пространство, но мое преобразованное изображение png - chloie1.png - выдает icon.png. Я добавил другое изображение - chloie2.png - и чередовал между chloie1 и chloie2, но только chloie1 показывает изображение значка. Таким образом, это состояние моих mThumbIds на данный момент:

private Integer[] mThumbIds = {
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2,
        R.drawable.chloie1, R.drawable.chloie2
};

и это вывод эмулятора:

Emulator Display - GridView Problem


РЕШЕНИЕ!
Как оказалось, по какой-то причине этот урок не будет работать для меня с изображениями в формате JPEG. Кроме того, я сделал глупое предположение и просто изменил расширение с .jpg на .png, которое все еще работало в средствах просмотра изображений, но все еще было признано андроидом как jpg. Теперь, когда я отредактировал каждое изображение в рисовании, а затем сохранил его в формате PNG, кажется, все работает нормально.

ОДНАКО Я все еще чувствую, что здесь есть проблема. Я предполагаю, что Android должен обрабатывать изображения .jpg, учитывая, что они предоставили JPEG в качестве образцов изображений. Если у кого-то есть идея относительно того, почему PNG работает, а JPG нет, пожалуйста, ответьте. В то же время, это простое исправление отлично подойдет.

Спасибо за помощь!



СПИСОК ЛИТЕРАТУРЫ

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
/>

HelloGridViewActivity.java

package com.marnbeast.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class HelloGridViewActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(new ImageAdapter(this));

    }
}

ImageAdapter.java

package com.marnbeast.android;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }

    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7
    };
}

LogCat Невозможно найти ресурс:

07-24 06:00:04.564: WARN/ResourceType(364): getEntry failing because entryIndex 3 is beyond type entryCount 1
07-24 06:00:04.564: WARN/ResourceType(364): Failure getting entry for 0x7f020003 (t=1 e=3) in package 0: 0x80000001
07-24 06:00:04.584: WARN/ImageView(364): Unable to find resource: 2130837507
07-24 06:00:04.584: WARN/ImageView(364): android.content.res.Resources$NotFoundException: Resource ID #0x7f020003
07-24 06:00:04.584: WARN/ImageView(364):     at android.content.res.Resources.getValue(Resources.java:891)
07-24 06:00:04.584: WARN/ImageView(364):     at android.content.res.Resources.getDrawable(Resources.java:579)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.ImageView.resolveUri(ImageView.java:485)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.ImageView.setImageResource(ImageView.java:270)
07-24 06:00:04.584: WARN/ImageView(364):     at com.marnbeast.android.ImageAdapter.getView(ImageAdapter.java:41)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.AbsListView.obtainView(AbsListView.java:1274)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.GridView.onMeasure(GridView.java:934)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.View.measure(View.java:7964)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.View.measure(View.java:7964)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.View.measure(View.java:7964)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
07-24 06:00:04.584: WARN/ImageView(364):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.View.measure(View.java:7964)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.ViewRoot.performTraversals(ViewRoot.java:763)
07-24 06:00:04.584: WARN/ImageView(364):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
07-24 06:00:04.584: WARN/ImageView(364):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 06:00:04.584: WARN/ImageView(364):     at android.os.Looper.loop(Looper.java:123)
07-24 06:00:04.584: WARN/ImageView(364):     at android.app.ActivityThread.main(ActivityThread.java:4363)
07-24 06:00:04.584: WARN/ImageView(364):     at java.lang.reflect.Method.invokeNative(Native Method)
07-24 06:00:04.584: WARN/ImageView(364):     at java.lang.reflect.Method.invoke(Method.java:521)
07-24 06:00:04.584: WARN/ImageView(364):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-24 06:00:04.584: WARN/ImageView(364):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-24 06:00:04.584: WARN/ImageView(364):     at dalvik.system.NativeStart.main(Native Method)

LogCat Resource Not Fount Exception после обхода проблемы с .setImageDrawable:

    07-24 07:02:50.234: ERROR/AndroidRuntime(390): Uncaught handler: thread main exiting due to uncaught exception
07-24 07:02:50.245: ERROR/AndroidRuntime(390): android.content.res.Resources$NotFoundException: Resource ID #0x7f020003
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.content.res.Resources.getValue(Resources.java:891)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.content.res.Resources.getDrawable(Resources.java:579)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at com.marnbeast.android.ImageAdapter.getView(ImageAdapter.java:40)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.widget.AbsListView.obtainView(AbsListView.java:1274)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.widget.GridView.onMeasure(GridView.java:934)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.View.measure(View.java:7964)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.View.measure(View.java:7964)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.View.measure(View.java:7964)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.View.measure(View.java:7964)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.ViewRoot.performTraversals(ViewRoot.java:763)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.os.Looper.loop(Looper.java:123)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at android.app.ActivityThread.main(ActivityThread.java:4363)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at java.lang.reflect.Method.invokeNative(Native Method)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at java.lang.reflect.Method.invoke(Method.java:521)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-24 07:02:50.245: ERROR/AndroidRuntime(390):     at dalvik.system.NativeStart.main(Native Method)

РЕДАКТИРОВАТЬ: Я включаю файл R, чтобы убедиться, что изображения правильно ссылки.

/* AUTO-GENERATED FILE.  DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found.  It
 * should not be modified by hand.
 */

package com.marnbeast.android;

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
        public static final int sample_0=0x7f020001;
        public static final int sample_1=0x7f020002;
        public static final int sample_2=0x7f020003;
        public static final int sample_3=0x7f020004;
        public static final int sample_4=0x7f020005;
        public static final int sample_5=0x7f020006;
        public static final int sample_6=0x7f020007;
        public static final int sample_7=0x7f020008;
    }
    public static final class id {
        public static final int gridview=0x7f050000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}

Ответы [ 4 ]

3 голосов
/ 18 августа 2011

мы можем использовать этот код,

public class MyGridView extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.animalsgridview);
GridView gridview = (GridView) findViewById(R.id.gridviewid);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        int imageId = ((ImageAdapter)parent.getAdapter()).mygetItemId(position);

        Intent fullScreenIntent = new Intent(v.getContext(),Full.class);
        fullScreenIntent.putExtra(Full.class.getName(),imageId);
        AnimalsGridView.this.startActivity(fullScreenIntent);         
        }
    });
}
private class ImageAdapter extends BaseAdapter {
    private Context mContext;
    public ImageAdapter(Context c) {
    mContext = c;
    }
    public int getCount() {
        return imagearray.length;
    }
    public Object getItem(int position) {
        return null;
    }
    public long getItemId(int position) {
        return imagearray[position];
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            imageView.setPadding(1, 1, 1, 1);

        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(imagearray[position]);
        return imageView;
    }
    // references to our images                    
    private Integer[] imagearray = {                 

        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7,
        R.drawable.sample_0, R.drawable.sample_1,
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7,
        R.drawable.sample_0, R.drawable.sample_1,
        R.drawable.sample_2, R.drawable.sample_3,
        R.drawable.sample_4, R.drawable.sample_5,
        R.drawable.sample_6, R.drawable.sample_7

        };
    public int mygetItemId(int position) {
                return imagearray[position];
    }                                
  }
}   

это код XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_weight="1"
  android:layout_height="fill_parent">
<GridView
    android:id="@+id/gridviewid"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:numColumns="auto_fit"
    android:columnWidth="60dp"
    android:stretchMode="columnWidth"
    android:padding="5dp"
    android:verticalSpacing="5dp"
    android:horizontalSpacing="20dp"        
    android:gravity="center_horizontal"
    android:background="#ffffff"/>    

2 голосов
/ 28 июля 2011

замените свой класс адаптера данным кодом

package com.marnbeast.android; 

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return mThumbIds[position];
    }

    public long getItemId(int position) {
        return position;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }

    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7
    };
}
0 голосов
/ 03 октября 2011

Попробуйте выполнить очистку / перестройку вашего проекта, пожалуйста

0 голосов
/ 17 сентября 2011

Обычно, в этих случаях, чистая и перестроенная программа решит проблему. Вполне возможно, что замена изображений просто вынудила ваш файл R обновиться.

Если нет, моя единственная мысль заключается в том, что Android поддерживает только базовые и прогрессивные JPEG. Если бы в вашем jpeg была какая-то странная оптимизация, это могло бы привести к неверному ресурсу.

...