2012-10-05 5 views
1

Я создаю пользовательский макет, в котором я хочу динамически добавлять изображение в галерею. Но как только я выбираю изображение из галереи, я получил силу. Я не могу понять, что такое ошибка.Android Dynamic ImageViews

Вот мой код ..

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 
+0

Всегда добавляйте свой отчет об ошибке logcat. –

ответ

2

вам нужно уменьшить значение i один как i был прирост в течение цикла, например, вы итерацию для 5 так что цикл for будет итерировать 5 время, начинающееся с 0 и заканчивающееся 4, но в это время значение i было увеличено сперва t курица будет проверять выражение 2 ли длины и i при этом значение времени i и values.size() одинаковы, так что завершить цикл выполнения остальной части кода

Edited

if(i==values.size() && i>0) 
    i--; 

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

и еще одну вещь вам нужно установить i=0 каждый раз, когда вы в onActivityResult() других мудром вы всегда получаете i последнего значения

+1

Pratik спасибо, но ваш английский менее понятен. Пожалуйста, не чувствую себя плохо. Я говорю об этом как о брате. –

+0

м принял ваш комментарий от всей души благодаря вашему комплименту. – Pratik

+0

Вы понимаете рабочий поток или нет? – Pratik

0

инициализации img_items массива в OnCreate:

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

В этот момент values.size() является «ноль».

Вы должны сделать это до того, как intialization цикл в onActivityResult:

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

Такая же проблема существует. Без изменений –

0

После просмотра кода я могу только сказать, что, когда вы инициализации массива ImageView с values.size()

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

в то время «значения» Arraylist имеют размер 0 и, следовательно, массив ImageView также имеет размер 0, а затем вы помещаете ImageView в массив размером 0 в onActivityResult().

img_items[i] = new ImageView(Dynamic.this); 
-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");   
      } 
     } 
    } 
} 
+0

Почему вы даете мне альтернативы .. ваш сценарий полностью разные, вы просто делаете это для одного изображения. Я просто хочу добавить динамически к любому нет. изображений. –

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(); 
Смежные вопросы