Android动态ImageViews

时间:2012-10-05 11:27:20

标签: android imageview android-linearlayout

我正在制作一个自定义布局,我想在其中动态添加图库视图。但是当我从画廊中挑选图像时,我就会关闭力量。我无法得到同样背后的错误。

这是我的代码..

public class Dynamic extends Activity {
int i;
ImageView[] img_items;
ArrayList<String> values = new ArrayList<String>();
LinearLayout imageLayout;
Button btn;
private static int RESULT_LOAD_IMAGE = 1;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dynamic_load);

    imageLayout = (LinearLayout)findViewById(R.id.image_layout);
    btn = (Button)findViewById(R.id.btn_ADD);
    img_items = new ImageView[values.size()];

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            values.add("AA");

            Intent i = new Intent(
                    Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(i, RESULT_LOAD_IMAGE);

        }
    });


}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        /*ImageView imageView = (ImageView) findViewById(R.id.imgView);
        imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));*/


        //Creating the image layouts dynamically
        for( i=0;i<values.size();i++){

            img_items[i] = new ImageView(Dynamic.this);

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

            params.setMargins(10, 10, 0, 0);
            img_items[i].setLayoutParams(params);

        }

        img_items[i].setImageBitmap(BitmapFactory.decodeFile(picturePath));
        imageLayout.addView(img_items[i]);


    }
}
}

LOG CAT

10-05 16:52:03.422: D/AndroidRuntime(451): Shutting down VM
10-05 16:52:03.422: W/dalvikvm(451): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-05 16:52:03.549: E/AndroidRuntime(451): FATAL EXCEPTION: main
10-05 16:52:03.549: E/AndroidRuntime(451): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/1 }} to activity {com.example.dynamicloading/com.example.dynamicloading.Dynamic}: java.lang.ArrayIndexOutOfBoundsException
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.app.ActivityThread.access$2800(ActivityThread.java:125)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.os.Looper.loop(Looper.java:123)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.app.ActivityThread.main(ActivityThread.java:4627)
10-05 16:52:03.549: E/AndroidRuntime(451):  at java.lang.reflect.Method.invokeNative(Native Method)
10-05 16:52:03.549: E/AndroidRuntime(451):  at java.lang.reflect.Method.invoke(Method.java:521)
10-05 16:52:03.549: E/AndroidRuntime(451):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-05 16:52:03.549: E/AndroidRuntime(451):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-05 16:52:03.549: E/AndroidRuntime(451):  at dalvik.system.NativeStart.main(Native Method)
10-05 16:52:03.549: E/AndroidRuntime(451): Caused by: java.lang.ArrayIndexOutOfBoundsException
10-05 16:52:03.549: E/AndroidRuntime(451):  at com.example.dynamicloading.Dynamic.onActivityResult(Dynamic.java:81)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.app.Activity.dispatchActivityResult(Activity.java:3890)
10-05 16:52:03.549: E/AndroidRuntime(451):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
10-05 16:52:03.549: E/AndroidRuntime(451):  ... 11 more
10-05 16:57:04.140: I/Process(451): Sending signal. PID: 451 SIG: 9

5 个答案:

答案 0 :(得分:2)

你需要将i值减一,因为i在for循环中是递增的,例如你有5时间的迭代,所以for循环将是迭代{{1时间以5开头并以0结尾,但此时4值先增加,然后检查2表达式是否长度和i那时i值和i是相同的,所以它终止for循环执行其余代码

<强>被修改

values.size()

还有一件事需要设置if(i==values.size() && i>0) i--; img_items[i].setImageBitmap(BitmapFactory.decodeFile(picturePath)); imageLayout.addView(img_items[i]); 每当你在i=0其他方面,你总是得到onActivityResult()最后一个值

答案 1 :(得分:0)

在onCreate中初始化数组img_items:

img_items = new ImageView[values.size()];

此时,values.size()为“零”。

你应该在onActivityResult中的for循环之前进行初始化:

    img_items = new ImageView[values.size()];
    for( i=0;i<values.size();i++){
    ...

答案 2 :(得分:0)

看完代码之后我可以说当你使用values.size()

初始化ImageView数组时
img_items = new ImageView[values.size()];

当时“值”Arraylist的大小为0,因此ImageView数组也是0大小,然后你将一个ImageView放在onActivityResult()的0大小数组中。

img_items[i] = new ImageView(Dynamic.this);

答案 3 :(得分:0)

下面是从图像意图加载多个图像的代码。我从How to pick an image from gallery (SD Card) for my app?

那里得到了帮助
  Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(
                               selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();
            for(int i=0;i<cursor.getCount();i++)
            {
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = cursor.getString(columnIndex);

            Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
            ImageView img_items = new ImageView(AnimatedPopupActivity.this);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            params.setMargins(10, 10, 0, 0);
            img_items.setLayoutParams(params);

            img_items.setImageBitmap(yourSelectedImage);
            imageLayout.addView(img_items);



            cursor.moveToNext();
            }
            cursor.close();

答案 4 :(得分:-1)

试试这个..

main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Button" />

</LinearLayout>

活动类..

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

    LinearLayout mainLinearLayout;
    Button button;
      Bitmap bmp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainLinearLayout = (LinearLayout)findViewById(R.id.mainLayout);
        button = (Button)findViewById(R.id.button1);

        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                openGallery();
            }
        });
    }


    private void openGallery()
    {
        Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, 1);
    }
    protected void onActivityResult(int requestCode, int resultcode, Intent intent)
    {
        super.onActivityResult(requestCode, resultcode, intent);


        if (requestCode == 1)
        {
            if (intent != null && resultcode == RESULT_OK)
            {             

                  Uri selectedImage = intent.getData();

                  String[] filePathColumn = {MediaStore.Images.Media.DATA};
                  Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                  cursor.moveToFirst();
                  int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                  String filePath = cursor.getString(columnIndex);
                  cursor.close();

                  if(bmp != null && !bmp.isRecycled())
                  {
                      bmp = null;               
                  }

                  bmp = BitmapFactory.decodeFile(filePath);

                 ImageView imageView = new ImageView(MainActivity.this);
                 imageView.setImageBitmap(bmp);
                 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(100,100);
                 imageView.setLayoutParams(lp);

                 mainLinearLayout.addView(imageView,lp);


            }
            else
            {
                Log.d("Status:", "Photopicker canceled");           
            }
        }
    }
}