Изменение макета с помощью другой операции

Есть ли способ, которым я могу изменить ImageView класса Main.class через Gallery.class?

мой основной класс onClick вызывает метод setImage of Gallery.class

public void setImage(int currentView) {

 Log.d("fgdsf","dumaan dito");
 this.currentView = currentView;
 Intent gallery = new Intent(Intent.ACTION_PICK,
 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 startActivityForResult(gallery, RESULT_LOAD_IMAGE);

}

и это onActivityResult

@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();

 LayoutInflater inflater = (LayoutInflater) mActivity
 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 View v = inflater.inflate(R.layout.activity_main, null);

 if (currentView == 0) {
 ImageView imageView = (ImageView) v
 .findViewById(R.id.imageView1);
 imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
 } 
 if(currentView==1)
 {
 ImageView imageView = (ImageView) v
 .findViewById(R.id.imageView2);
 imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
 }

 }
}

и я получаю эту ошибку

08-07 08: 35: 08.208: E/AndroidRuntime (15689): вызвано: java.lang.NullPointerException 08-07 08: 35: 08.208: E/AndroidRuntime (15689): at android.app.Activity.startActivityForResult(Activity.java: 3370)

3 ответа

Я не думаю, что ты можешь. Вы можете управлять макетом своей текущей деятельности вместе со своими компонентами. Поскольку компонент не находится на виду вашего текущего действия (в вашем случае это Галерея), доступ к нему будет вызывать исключение NullPointerException. Что вы можете сделать, это передать путь выбранного изображения в галерею к основному классу, затем получить путь к изображению и установить его в свой ImageView.


Я думаю, что ваш лучший вариант - установить интерфейс в Gallery.class, например

public class Gallery extends Activity {

 public interface MyClickListener {
 public void OnClick();
 }

 private MyClickListener listener;

Затем в вашем onClick установите свой OnClick (listener.OnClick()). В Main.class вам нужно будет импортировать "MyClickListener" и определить, какие действия вы хотите выполнить.


Для захвата изображения

Это происходит из android 4.0 onward

Прежде чем он вернул путь uri изображения, но теперь он возвращает растровое изображение из галереи.

Поэтому, чтобы решить эту проблему.

File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".jpg");

Uri imgUri = Uri.fromFile(file);
String imagepath = file.getAbsolutePath();

final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imagepath);
startActivityForResult(intent, CAPTURE_IMAGE);


@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if (resultCode != Activity.RESULT_CANCELED) {
 if (requestCode == CAPTURE_IMAGE) {
 imgUser.setImageBitmap(BitmapFactory.decodeFile(imagepath);
 } else {
 super.onActivityResult(requestCode, resultCode, data);
 }
 }

 }

Для выбора изображения из галереи

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);


public String getAbsolutePath(Uri uri) {
 String[] projection = { MediaColumns.DATA };
 @SuppressWarnings("deprecation")
 Cursor cursor = managedQuery(uri, projection, null, null, null);
 if (cursor != null) {
 int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
 cursor.moveToFirst();
 return cursor.getString(column_index);
 } else
 return null;
 }

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if (resultCode != Activity.RESULT_CANCELED) {
 if (requestCode == PICK_IMAGE) {

 imgUser.setImageBitmap(BitmapFactory.decodeFile(getAbsolutePath(data.getData()));
 } else {
 super.onActivityResult(requestCode, resultCode, data);
 }
 }

 }

licensed under cc by-sa 3.0 with attribution.