4

私は Android を初めて使用し、Java を少し知っていますが、学びたいので、チュートリアルを続けています。私がやりたいことのアイデアは次のとおりです。たとえば、レンダリングされたメニューがあります。画像のIDと説明をxmlに保存しています。このような:

<signs>
    <sign id="1_1" category="1">
        <name>desc1</name>
    </sign>
    <sign id="1_2" category="1">
        <name>desc2</name>
    </sign>
    <sign id="1_3_1" category="1">
        <name>desc3</name>
    </sign>
    <sign id="1_3_2" category="1">
        <name>desc4</name>
    </sign>
</signs>

画像は、ドローアブルの sign_1_1.png、sign_1_2.png のようになります。

ギャラリーを作成しました。表示されています。説明と画像も表示されます。画像ギャラリーの選択した画像で、対応する説明をTextViewで表示するようにしました。しかし、タップすると致命的な例外が発生します:

E/AndroidRuntime(22141): FATAL EXCEPTION: main
E/AndroidRuntime(22141): java.lang.NullPointerException
E/AndroidRuntime(22141): at apcmag.examples.singleSignListItem$ImageAdapter.getView(singleSignListItem.java:117)
E/AndroidRuntime(22141):    at android.widget.Gallery.makeAndAddView(Gallery.java:849)
E/AndroidRuntime(22141): at android.widget.Gallery.fillToGalleryRightLtr(Gallery.java:803)
E/AndroidRuntime(22141):    at android.widget.Gallery.fillToGalleryRight(Gallery.java:747)
E/AndroidRuntime(22141):    at android.widget.Gallery.layout(Gallery.java:656)
E/AndroidRuntime(22141):    at android.widget.Gallery.onLayout(Gallery.java:351)
E/AndroidRuntime(22141):    at android.view.View.layout(View.java:13754)
E/AndroidRuntime(22141):    at android.view.ViewGroup.layout(ViewGroup.java:4362)

コードは次のとおりです。

package apcmag.examples;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;

import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


public class singleSignListItem extends Activity
{

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        this.setContentView(R.layout.single_sign_gallery);

        Gallery g = (Gallery) findViewById(R.id.gallery);

        final Intent i = getIntent();
        final String REGEX = "/%%/";

        String product = i.getStringExtra("product");

        setTitle(product);

        g.setAdapter(new ImageAdapter(this));

        g.setOnItemSelectedListener(new OnItemSelectedListener() {
          public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                String [] products = i.getStringExtra("product_text").split(REGEX);
                Toast.makeText(singleSignListItem.this, ""+position, Toast.LENGTH_SHORT).show();
                TextView show_intro = (TextView) findViewById(R.id.show_intro);
                show_intro.setText(""+products[position]);
            }

            public void onNothingSelected(AdapterView<?> parent)
            {
                // TODO Auto-generated method stub

            }
        });
    }

    public class ImageAdapter extends BaseAdapter {
        int mGalleryItemBackground;
        private Context mContext;


//        private Integer[] mImageIds = {
//                R.drawable.sign_1_1,
//                R.drawable.sign_1_1,
//                R.drawable.sign_1_1,
//                R.drawable.sign_1_1
//        };

        private Integer[] mImages = takePhotos();

        public Integer[] takePhotos (){
            Intent g = getIntent();
            String Reg = "/%%/";
            String Reg2 = "_%_";

            String dataList = g.getStringExtra("product_text");
            String [] datastring = dataList.split(Reg);

            Integer[] imageResource = new Integer[20];

            String[] dd = null;

            for(int k = 0; k<datastring.length;k++){
                dd = datastring[k].split(Reg2);

            String imagename = "sign_"+dd[0];

            imageResource[k] = getResources().getIdentifier(imagename, "drawable", getPackageName());

            }

            return imageResource;

        }

        public ImageAdapter(Context c) {
            mContext = c;
            TypedArray a = obtainStyledAttributes(R.styleable.HelloGallery);
            mGalleryItemBackground = a.getResourceId(
                    R.styleable.HelloGallery_android_galleryItemBackground, 0);
            a.recycle();
        }

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

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

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

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(mContext);

            i.setImageResource(mImages[position]);
            i.setLayoutParams(new Gallery.LayoutParams(115, 200));
            i.setScaleType(ImageView.ScaleType.FIT_XY);
            i.setBackgroundResource(mGalleryItemBackground);

            return i;
        }
    }

}

何時間も問題が何であるかを理解できません。ここにあるかもしれないという考えがいくつかあります。

 i.setLayoutParams(new Gallery.LayoutParams(115, 200));

しかし、私は何をすべきかよくわかりません

アップデート

実際に私は問題を見つけました:

77行目で、サイズ20でImageResourceを初期化していました

Integer[] imageResource = new Integer[20];

しかし、分割されたデータ文字列には4つの要素しかありませんでした

String [] datastring = dataList.split(Reg);

だから mImages 変数

 private Integer[] mImages = takePhotos();

20個の要素があり、そのうち16個がnullになり、最終的に

i.setImageResource(mImages[position]);

null 要素をレンダリングできず、クラッシュしました。

だから私は別の質問があります:

可能性のある Integer[] のサイズがわからない場合、要素を初期化してプッシュするにはどうすればよいですか? リスト付き?

4

4 に答える 4

1

実際に私は問題を見つけました:

77行目でサイズ20のImageResourceを初期化していた

Integer [] imageResource = new Integer [20];

しかし、分割されたデータ文字列には4つの要素しかありませんでした

String [] datastring = dataList.split(Reg);

したがって、mImages変数

 private Integer[] mImages = takePhotos();

20個の要素があり、そのうち16個はnullになり、最終的には

i.setImageResource(mImages[position]);

null要素をレンダリングできず、クラッシュしました。

于 2012-10-12T16:30:28.557 に答える
0

public Object getItem(int position) { return position; } public long getItemId(int position) { 位置を返します。戻り値の型を確認してください。どちらもintになると思います。

于 2012-10-12T16:34:57.090 に答える
-1

この行にエラーがあります:

for(int k = 0; k<datastring.length;k++){
  dd = datastring[k].split(Reg2);

これを行うと、次の作業が行われると思います。

dd = datastring.split(Reg2);
于 2012-10-12T15:39:45.880 に答える
-2

I think the problem is String[] dd = null; code. u must initialize dd variable

于 2012-10-12T15:28:53.160 に答える