使用onActivityResult

时间:2017-11-22 23:19:36

标签: android

我尝试在我的画廊中选择一张图片。 我转换了startActivityForResult,因为我的类没有扩展一个Activity,我需要使用onActivityResult来设置所选图像的imageview。 我的代码......

Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
getIntent.setType("image/*");
Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");

Intent chooserIntent = Intent.createChooser(getIntent, "Elegir imagen");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent});            
((Activity)context).startActivityForResult(chooserIntent, INTENT_ELEGIR_IMAGEN);

我的onActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {
            case INTENT_ELEGIR_IMAGEN:
                Uri selectedImageUri = data.getData();

                if(selectedImageUri !=null) {
                    try {
                        fotoJugador.setImageBitmap(decodeUri(selectedImageUri));
                        imageSelected = true;
                    } catch (FileNotFoundException e) {
                        throw new RuntimeException(e);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                break;
        }
    }
}

如果没有解决方案,请提出建议! 谢谢! 我添加了完整的代码

public class SeccionAdapterJugadorEquipoInfo extends RecyclerView.Adapter<com.followup.arielverdugo.followup.SeccionAdapterJugadorEquipoInfo.SeccionJugadorInfoViewHolder> {
private List<Jugador> jugadores;
public Equipo equipo;

private static RecyclerViewClickListener itemListener;
private Context c;


    public static class SeccionJugadorInfoViewHolder extends 
     RecyclerView.ViewHolder{
    // each data item is just a string in this case
    public ImageView fotoJugador;
    //public ImageView escudo;
    public TextView nombreJugador;
    public TextView nombreEquipo;
    public TextView posicion;
    public TextView altura;
    public CardView cv;
    public ImageView menu;


    public SeccionJugadorInfoViewHolder(View v) {
        super(v);

        //fotoJugador = (ImageView) v.findViewById(R.id.fotoEquipoJugadorInfo);
        fotoJugador = (ImageView) v.findViewById(R.id.fotoJugador);
        nombreJugador = (TextView) v.findViewById(R.id.nombreJugadorInfo);
        posicion = (TextView) v.findViewById(R.id.posicionJugadorEquipoInfo);
        //nombreEquipo = (TextView) v.findViewById(R.id.nombreEquipoJugadorInfo);
        //nombreEquipo = (TextView) v.findViewById(R.id.nombreEquipoJugadorInfo);
        cv = (CardView) v.findViewById(R.id.cardViewJugadorEquipoInfo);
        menu =(ImageView) v.findViewById(R.id.menu);
        final CheckBox checkBox = (CheckBox) v.findViewById(R.id.star);
    }

}

public SeccionAdapterJugadorEquipoInfo(Equipo e, List<Jugador> jugadores ,Context c) {
    this.equipo = equipo;
    this.jugadores = jugadores;
    this.c=c;

}



@Override
public com.followup.arielverdugo.followup.SeccionAdapterJugadorEquipoInfo.SeccionJugadorInfoViewHolder onCreateViewHolder(ViewGroup parent,
                                                                                                                          int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.activity_card_jugadorequipoinfo, parent, false);

    return new com.followup.arielverdugo.followup.SeccionAdapterJugadorEquipoInfo.SeccionJugadorInfoViewHolder(v);
}


@Override
public void onBindViewHolder(final com.followup.arielverdugo.followup.SeccionAdapterJugadorEquipoInfo.SeccionJugadorInfoViewHolder viewHolder, final int i) {


    final int id = jugadores.get(i).getId();
    if(jugadores.get(i).getFoto() != null){
        Bitmap fotoJugador = BitmapFactory.decodeByteArray(jugadores.get(i).getFoto(), 0, jugadores.get(i).getFoto().length);
        viewHolder.fotoJugador.setImageBitmap(fotoJugador);

    } else {
        viewHolder.fotoJugador.setImageResource(R.drawable.sinimagen);
    }


    viewHolder.nombreJugador.setText(jugadores.get(i).getNombre() + " " +jugadores.get(i).getApellido());
    viewHolder.posicion.setText(jugadores.get(i).getPosicion());
    viewHolder.menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showPopupMenu(viewHolder.menu,i,c,id);
        }
    });

}

private void showPopupMenu(View view,int position,Context context,int id) {
    // inflate menu
    PopupMenu popUp = new PopupMenu(view.getContext(),view);
    MenuInflater inflater = popUp.getMenuInflater();
    inflater.inflate(R.menu.delete_edit_jugadorequipoinfo, popUp.getMenu());
    popUp.setOnMenuItemClickListener(new com.followup.arielverdugo.followup.MyMenuItemClickListener(position,c,id));
    popUp.show();


}




// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
    return jugadores.size();
}

}

class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener{

private RecyclerView.Adapter lastmAdapter;
private int position;
private Context context;
private int id;
private ImageView fotoJugador;
public static final int INTENT_ELEGIR_IMAGEN = 1;
private Boolean imageSelected = false;



public MyMenuItemClickListener(int positon,Context context,int id) {
    this.position=positon;
    this.context = context;
    this.id = id;
}

@Override
public boolean onMenuItemClick(MenuItem menuItem) {
    switch (menuItem.getItemId()) {
        case R.id.editarJugadorEquipo:
            final Jugador jugadorEditar = JugadorRepository.getInstance(context).findJugadorById(id);

            LayoutInflater inflater = (LayoutInflater) context.getSystemService( context.LAYOUT_INFLATER_SERVICE);
            final ViewGroup popupViewEditar = (ViewGroup) inflater.inflate(R.layout.dialog_editar_jugador, null);
            String nombreAnterior = jugadorEditar.getNombre();
            String apellidoAnterior = jugadorEditar.getApellido();
            byte[] fotoAnterior = jugadorEditar.getFoto();


            EditText nombre = (EditText) popupViewEditar.findViewById(R.id.editarNombreJugador);
            nombre.setText(nombreAnterior);
            EditText apellido = (EditText) popupViewEditar.findViewById(R.id.editarApellidoJugador);
            apellido.setText(apellidoAnterior);


            if (fotoAnterior == null)
            {
                fotoJugador = (ImageView) popupViewEditar.findViewById(R.id.editarFotoJugador);
                fotoJugador.setImageResource(R.drawable.anadirimagen);
                fotoJugador.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        //para ir a la galeria
                        Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
                        getIntent.setType("image/*");

                        Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        pickIntent.setType("image/*");

                        Intent chooserIntent = Intent.createChooser(getIntent, "Elegir imagen");
                        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent});

                        //utiliza la constante INTENT_ELEGIR_IMAGEN en onActivityResult
                        ((Activity) context).startActivityForResult(chooserIntent, INTENT_ELEGIR_IMAGEN);
                        onActivityResult(chooserIntent);



                    }
                });

            }
            else
            {
                fotoJugador = (ImageView) popupViewEditar.findViewById(R.id.editarFotoJugador);

                Bitmap bitmap = BitmapFactory.decodeByteArray(fotoAnterior, 0, fotoAnterior.length);
                fotoJugador.setImageBitmap(bitmap);

                fotoJugador.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        //para ir a la galeria
                        Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
                        getIntent.setType("image/*");

                        Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        pickIntent.setType("image/*");

                        Intent chooserIntent = Intent.createChooser(getIntent, "Elegir imagen");
                        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent});

                        //utiliza la constante INTENT_ELEGIR_IMAGEN en onActivityResult
                        ((Activity) context).startActivityForResult(chooserIntent, INTENT_ELEGIR_IMAGEN);
                        onActivityResult(chooserIntent);





                    }
                });
            }
            //se crea y llena el spiner de equipos
            List<Equipo> equipos = EquipoRepository.getInstance(context).getEquipos();
            ArrayList<String> equiposNombre = new ArrayList<>();
            for (int i = 0; i < equipos.size(); i++)
            {
                equiposNombre.add(equipos.get(i).getNombre());
            }

            final Spinner spinnerEquipos = (Spinner) popupViewEditar.findViewById(R.id.editarEquipoJugador);
            ArrayAdapter<String> adapter;
            adapter = new ArrayAdapter<String>(context,R.layout.spinner_equipos, equiposNombre);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            //Cree una clase NothingSelectedSpinnerAdapter y un xml Spinner_row_selected
            spinnerEquipos.setAdapter(adapter);
            String compareValue = jugadorEditar.getEquipo().getNombre();

            if (!compareValue.equals(null)) {
                int spinnerPosition = adapter.getPosition(compareValue);
                spinnerEquipos.setSelection(spinnerPosition);
            }


            //se crea y llena el spinner de posciones
            ArrayList<String> posicionesJugadores = new ArrayList<>();
            posicionesJugadores.add("Base");
            posicionesJugadores.add("Ayuda Base");
            posicionesJugadores.add("Alero");
            posicionesJugadores.add("Ala Pivot");
            posicionesJugadores.add("Pivot");

            final Spinner spinnerPosiciones = (Spinner) popupViewEditar.findViewById(R.id.editarPosicionJugador);
            ArrayAdapter<String>adapterPosiciones;
            adapterPosiciones = new ArrayAdapter<String>(context,R.layout.spinner_posicion, posicionesJugadores);
            adapterPosiciones.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinnerPosiciones.setAdapter(adapterPosiciones);
            String compareValuePosicion = jugadorEditar.getPosicion();

            if (!compareValuePosicion.equals(null)) {
                int spinnerPosition = adapterPosiciones.getPosition(compareValuePosicion);
                spinnerPosiciones.setSelection(spinnerPosition);
            }

            //se crea y llena el spinner de altura

            Integer alturaMinima = 160;
            Integer alturaMaxima = 221;
            Integer step = 1;
            String[] myValues = getArrayWithSteps(alturaMinima, alturaMaxima, step);
            NumberPicker picker = new NumberPicker(context);
            picker.setDisplayedValues(myValues);
            picker.setWrapSelectorWheel(false);

            final Spinner spinnerAlturas = (Spinner) popupViewEditar.findViewById(R.id.editarAlturaJugador);
            ArrayAdapter<String> adapterAltura;
            adapterAltura = new ArrayAdapter<String>(context,R.layout.spinner_altura, myValues);
            adapterAltura.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinnerAlturas.setAdapter(adapterAltura);
            int alturaJugador = jugadorEditar.getAltura();
            String compareValueAltura = Integer.toString(alturaJugador);

            if (!compareValueAltura.equals(null)) {
                int spinnerPosition = adapterAltura.getPosition(compareValueAltura);
                spinnerAlturas.setSelection(spinnerPosition);
            }



            AlertDialog.Builder builderEditar =
                    new AlertDialog.Builder(context)
                            .setTitle("Editar Jugador")
                            .setPositiveButton("Editar", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    // capturar y gaurdadr en bd
                                    final String NOMBRE = (((TextView) popupViewEditar.findViewById(R.id.editarNombreJugador)).getText().toString());
                                    final String APELLIDO = (((TextView) popupViewEditar.findViewById(R.id.editarApellidoJugador)).getText().toString());
                                    Bitmap FOTO = null;
                                    FOTO = ((BitmapDrawable) ((ImageView) popupViewEditar.findViewById(R.id.editarFotoJugador)).getDrawable()).getBitmap();

                                    jugadorEditar.setNombre(NOMBRE);
                                    jugadorEditar.setApellido(APELLIDO);
                                    jugadorEditar.setFoto(Utils.getByteArrayFromBitmap(FOTO));

                                    JugadorRepository.getInstance(context).updateJugador(jugadorEditar);
                                    Toast.makeText(context, "Jugador editado", Toast.LENGTH_SHORT).show();

                                    //se refresca el cardview

                                    dialog.dismiss();

                                }
                            })
                            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.cancel();
                                }
                            });
            builderEditar.setView(popupViewEditar);
            builderEditar.show();

            break;


        case R.id.eliminarJugadorEquipo:
            AlertDialog.Builder builderEliminar;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                builderEliminar = new AlertDialog.Builder(context, android.R.style.Theme_Material_Dialog_Alert);
            } else {
                builderEliminar = new AlertDialog.Builder(context);
            }
            builderEliminar.setTitle("Delete entry")
                    .setMessage("Are you sure you want to delete this entry?")
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            JugadorRepository.getInstance(context).deleteJugadorById(id);
                            Equipo e = EquipoRepository.getInstance(context).findEquipoById(JugadorEquipoInfoActivity.idEquipo);
                            lastmAdapter = new com.followup.arielverdugo.followup.SeccionAdapterJugadorEquipoInfo(e,new ArrayList<Jugador>(e.jugadores),context);
                            FragmentJugadorEquipoInfo.mRecyclerViewStatic.setAdapter(lastmAdapter);
                        }
                    })
                    .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // do nothing
                            dialog.cancel();
                        }
                    })
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .show();

            break;
        default:
    }
    return false;
}

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {
            case INTENT_ELEGIR_IMAGEN:
                Uri selectedImageUri = data.getData();

                if(selectedImageUri !=null) {
                    try {
                        fotoJugador.setImageBitmap(decodeUri(selectedImageUri));
                        imageSelected = true;
                    } catch (FileNotFoundException e) {
                        throw new RuntimeException(e);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                break;
        }
    }
}




private  Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;

    BitmapFactory.decodeStream(context.getContentResolver().openInputStream(selectedImage), null, o);
    // The new size we want to scale to
    final int REQUIRED_SIZE = 150;

    // Find the correct scale value. It should be the power of 2.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;
    while (true) {
        if (width_tmp / 2 < REQUIRED_SIZE
                || height_tmp / 2 < REQUIRED_SIZE) {
            break;
        }
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
    }

    // Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    return BitmapFactory.decodeStream(context.getContentResolver().openInputStream(selectedImage), null, o2);

}

public String[] getArrayWithSteps(Integer iMinValue,Integer iMaxValue, Integer iStep)
{
    double iStepsArray = iMaxValue-iMinValue; //obtengo el largo del array

    String[] arrayValues= new String[(int)iStepsArray]; //creo un array de ese largo
    arrayValues[0] = String.valueOf(iMinValue);

    for(int i = 1; i < iStepsArray; i++)
    {
        arrayValues[i] = String.valueOf(Integer.parseInt(arrayValues[i-1])+iStep);
    }

    return arrayValues;
}

在我的活动中,我有一个recyclerview和我的cardview。在我的cardview中我有一个overflowmenu,它有2个项目:*删除和*编辑 当您单击编辑时,我创建一个对话框,其中包含要编辑的属性,其中一个是图像。我有一个imageview,当你点击它时,启动选择意图来选择图库中的图像。所有在这个指针都没关系,但我不能设置imageview因为我不能得到我选择的图像。

1 个答案:

答案 0 :(得分:0)

首先,请询问访问外部/内部存储的权限。

从代码下方的图库中选择图片。

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 0);

您的onActivityResult将如下:

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

    if (requestCode == 0 && resultCode == RESULT_OK && data != null && data.getData() != null) {

        Uri uri = data.getData();

        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);

            fotoJugador.setImageBitmap(bitmap);
            imageSelected = true;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

从代码中删除onActivityResult(chooserIntent);

运行此命令并告诉我这是否有效。