Android Hello GridViewチュートリアルは画像を表示しません
-
25-10-2019 - |
質問
初めてポスター!
私はAndroid Developmentを初めて使用しており、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エミュレーターの両方でこのプログラムを試しました。私はすべての輸入品を持っていて、コードがコンパイルされ、正常に実行されます。ただし、私のアクティビティは黒い画面のみを表示します。画像が表示されません。黒い背景をクリックすると、オレンジ色の正方形が画像のある場所に表示されます。この問題に言及している1つまたは2つの投稿が見つかりましたが、それは常にいくつかのより大きく、より明白な問題と結びついており、決して対処されませんでした。参照のために、以下にコードとログキャットをリストします。
私のログキャットが言及したことに気づきました:
WARN/ImageView(364): Unable to find resource: 2130837507
それが私をこのスレッドに導きました:Setimageresourceが何も表示しない理由Setimageresourceの代わりにSetimagedRawableを使用して、可能な回避策を詳述します。次のコード行を使用してこれを実装しました。
imageView.setImageDrawable(mContext.getResources().getDrawable(mThumbIds[position]));
ただし、これにより、コードをクラッシュさせたリソース$ notFoundExceptionが作成されました(以下にも文書化されています)。
結論は
Androidチュートリアルには回避策が必要ないと考えているので、ある種の構成の問題があると推測しています。数時間の検索と試みの後、私はまだ解決策を見つけていないので、私はそれがいくつかの議論を保証すると考えました。また、これが私の最初の投稿であるため、目立っている偽のPAが見える場合はお知らせください。近づいてくるWall-Oコードについては事前にお詫び申し上げますが、データが少なすぎるとはあまりにも悪いかもしれないと考えています。 :d
みんなありがとう!
マーンビースト
アップデート
MthumbidsでR.Drawable.iconを使用してみました。写真はどれも現れませんでしたが、アイコンはそうしました。その後、写真の.pngバージョンを試しましたが、それもうまくいきませんでした。 icon.pngの画像をコピーして、塗料で編集し(Android Guy:Dに口ひげを置く)、Dummyicon.pngとして保存しました。私はそれとアイコンを交互に繰り返しましたが、それもうまくいきませんでした。最後に、すべてのアイコン参照を取り除き、PNG画像を使用しましたが、奇妙なことに、実行すると、すべての画像がアイコンとして表示されていますが、mthumbidsで参照していません!これは、何も表示されなかった以前の動作とは異なります。私はカップルをDummyiconに変更しましたが、実行すると、それらの画像はまったく現れませんでした /黒人でした。他のすべての画像(Mthumbidsで繰り返される1つのPNG変換画像)は、まだアイコンとして表示されています。
最後に、変換されたPNG画像の参照を再びアイコンに置き換え、アイコンとダミーコンを交互に交互に置きましたが、どちらも現れませんでした - 再び黒い画面だけです。したがって、Dummyiconとアイコンはどちらも参照されたときに何も生じませんが、黒いスペースだけですが、変換されたPNG画像-Chloie1.png-はiCon.pngを生成します。別の写真-Chloie2.png - を追加し、Chloie1とChloie2の間で交互に並べましたが、chloie1のみがアイコン画像を示しています。したがって、これは今のところ私のmthumbidの状態です:
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に変更しました。各画像をペイントで編集し、PNGタイプとして保存したので、すべてが正常に機能するようです。
でも ここには問題があると感じています。 Androidは、JPEGをサンプル写真として提供したことを考慮して、.jpg画像を処理する必要があると思います。 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リソース。
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;
}
}
解決
このコードを使用できます。
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"/>
他のヒント
指定されたコードでアダプタークラスを交換します
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
};
}
通常、これらの場合、プロジェクトをきれいで再構築すると、問題が解決します。画像を交換すると、Rファイルが更新されるだけである可能性があります。
そうでない場合、私の唯一の考えは、AndroidがベースラインとプログレッシブJPEGのみをサポートしているということです。 JPEGに何らかの奇妙な最適化がある場合、それが無効なリソースを作ることができたでしょう。
プロジェクトをきれいに/再構築してみてください