Первый плакат!
Я новичок в разработке 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 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]));
однако, что только что привело к ресурсу $NotFoundException, который разбил мой код (также описанный ниже).
ЗАКЛЮЧЕНИЕ
Я полагаю, что учебник Android не должен требовать обходного пути, поэтому я предполагаю, что у меня какая-то проблема конфигурации. После нескольких часов поиска и попыток, я еще не нашел решения, поэтому решил, что это требует обсуждения. Кроме того, если это мой первый пост, пожалуйста, дайте мне знать, если вы увидите какой-либо вопиющий faux pas. Я заранее извиняюсь за надвигающийся настенный код, хотя я считаю, что слишком мало данных может быть хуже, чем слишком много.: D
Спасибо, ребята!
MarnBeast
UPDATE
Я попытался использовать R.drawable.icon в своих mThumbIds, чередуясь между этим и одним из моих изображений. Ни одна из картинок не появилась, но значки сделали. Затем я попробовал .png версию моей картинки, но это тоже не сработало. Я скопировал изображение icon.png и отредактировал его в краске (положил усы на парня android: D) и сохранил его как dummyicon.png. Я чередовался между этим и значком, но это тоже не сработало. Наконец, я избавился от всех ссылок на значки и просто использовал свой png-образ, но, как ни странно, во время запуска ВСЕ изображения отображались как значок, хотя я не ссылаюсь на него в mThumbIds! Это отличается от предыдущего поведения, когда ничего не отображается. Я сменил пару на dummyicon, и, когда они запускались, эти изображения просто не отображались/были просто черными. Все остальные изображения (одно png преобразованное изображение, повторенное в mThumbIds) все еще отображались как значки.
Наконец, я заменил обратные ссылки на png изображения с помощью значка снова, чередуя значок и dummyicon, и теперь ни один из них не появляется - снова черный экран. Таким образом, похоже, что dummyicon и значок ничего не дают при упоминании, просто черное пространство, но мой преобразованный png-образ - chloie1.png - дает значок .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
};
и это результат работы эмулятора:
РЕШЕНИЕ!
Как выяснилось, по какой-то причине этот урок не будет работать для меня с изображениями JPEG. Кроме того, я сделал глупое предположение и просто изменил расширение с .jpg на .png, которое все еще работало в зрителях изображений, но все еще было признано как jpg от android. Теперь, когда я отредактировал каждую фотографию в краске, а затем сохранил ее как PNG-тип, все работает нормально.
ОДНАКО Я все еще чувствую, что здесь есть проблема. Я предполагаю, что андроид должен обрабатывать изображения .jpg, считая, что они предоставили jpegs в качестве их образцовых изображений. Если у кого-то есть идея, почему 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 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 Not Fount после обхода проблемы с .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)
EDIT: Я включаю файл 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;
}
}