ユーザーの現在の場所を見つける必要があるアプリを作成しています。
したがって、ここでは、ユーザーがそのシステムインテントから戻ったときのようなタスクを実行したいのですが、その後、私のタスクを実行する必要があります(ユーザーの現在の場所の表示)
だから私はOnActivityResult()
を使うつもりです。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
しかし問題は、Activityを拡張していないクラスでそのメソッドをどのように使用できるかわからないことです。
誰かが私にこれをどのように達成できるか考えてください?
結果を受け取るには、アクティビティが必要です。
コードを整理するだけの場合は、Activityクラスから別のクラスを呼び出します。
public class Result {
public static void activityResult(int requestCode, int resultCode, Intent data){
...
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Result.activityResult(requestCode,resultCode,data);
...
}
非Activityクラスに内部クラスを作成し、その中にアクティビティ結果ハンドラーを定義します。
class singletonActivity extends Activity{
protected void onActivityResult(...){
// do whatever ..
}
}
startActivityForResultを呼び出すようにインスタンス化する
Activity actv = new singletonActivity(..)
actv.startActivityForResult(intent ..)
ハンドラが呼び出されます。 :)
pS:いくつかのオーバーライドを含める必要があるかもしれません。空のままにしておきます。
pps:これは古い学校ですJava mouseListenerAdapter style〜Oo>
このメソッドを彼のスコープ外で呼び出すことはできません。
_protected void onActivityResult (int requestCode, int resultCode, Intent data)
_
この方法のようにメソッドがprotectedである場合、-Access Levelsの表を参照して続行方法を確認できます。
_|-----------------------------------------------------------|
| ACCESS LEVELS |
|------------------|---------|---------|----------|---------|
| Modifier | Class | Package | Subclass | World |
|------------------|---------|---------|----------|---------|
| public | Y | Y | Y | Y |
|------------------|---------|---------|----------|---------|
| protected | Y | Y | Y | N |
|------------------|---------|---------|----------|---------|
| no modifier | Y | Y | N | N |
|------------------|---------|---------|----------|---------|
| private | Y | N | N | N |
|------------------|---------|---------|----------|---------|
_
ご覧のとおり、このメソッドは_Android.app.*
_パッケージ、Activity
、およびそれらのサブクラスからのみ呼び出すことができます。
解決策:
あなたはこのようなことをする必要があります:
GalleryまたはCameraまたはDeleteから画像を選択するためのImagePicker
クラスがあります。ユーザーが画像を削除したい場合、このクラスはonActivityResult
を呼び出す必要があります(すでにわかっている結果を得るためにActivity
を開始する必要はありません)。
_public class ImagePicker {
private ImagePickerDelegate delegate;
public ImagePicker (ImagePickerDelegate delegate) {
this.delegate = delegate;
}
//Will explain this two methods later
public void show() {
//Some code to show AlertDialog
}
public void handleResponse(Intent data) {
//Some code to handle onActivityResult
}
//Our interface to delegate some behavior
public interface ImagePickerDelegate {
void onImageHandled(Bitmap image);
void onImageError();
void onImageDeleted();
}
}
_
このクラスをActivity
で使用するには、デリゲートメソッドを実装し、アクティビティをImagePicker
のデリゲートとして渡す必要があります。
_public class MyActivity extends Activity implements ImagePicker.ImagePickerDelegate {
ImagePicker imagePicker;
@OnClick(R.id.image_edit)
public void selectImage () {
imagePicker = new ImagePicker(this);
imagePicker.show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ImagePicker.REQUEST_IMAGE_PICKER && resultCode == RESULT_OK) {
imagePicker.handleResponse(data);
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onImageHandled(Bitmap image) {
//handle image resized
imageView.setImageBitmap(image);
}
@Override
public void onImageError() {
//handle image error
Toast.makeText(this, "Whoops - unexpected error!", Toast.LENGTH_SHORT).show();
}
@Override
public void onImageDeleted() {
//handle image deleted
groupImageView.setImageBitmap(null);
groupImageView.setImageResource(R.drawable.ic_pick_picture);
}
}
_
最後に、30個のデリゲートメソッドを呼び出す必要があります。これはshow()
とhandleResponse(Intent data)
で行われます。
_//The show method create and dialog with 3 options,
//the important thing here, is when an option is selected
public void show() {
//Inflating some views and creating dialog...
NavigationView navView = (NavigationView)viewInflated.findViewById(R.id.navigation_menu);
navView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.action_select_image:
Intent pickPhoto = new Intent(Intent.ACTION_PICK, Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
activity.startActivityForResult(pickPhoto , REQUEST_IMAGE_PICKER);
break;
case R.id.action_take_picture:
Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
activity.startActivityForResult(takePicture, REQUEST_IMAGE_PICKER);
break;
case R.id.action_delete_image:
delegate.onImageDeleted(); //send response to activity
break;
}
alertDialog.dismiss();
return true;
}
});
//Show dialog...
}
//this method is called from onActivityResult
public void handleResponse(Intent data) {
try {
//Retrieve and resize image...
delegate.onImageHandled(image); //send the image to activity
} catch (Exception e) {
e.printStackTrace();
delegate.onImageError(); //send error to activity
}
}
_
最後に、class
ではなくActivity
内のメソッドを呼び出すことができるonActivityResult
がありますが、onActivityResult
で結果を取得するときは、そのclass
で処理する必要があります
このクラスにActivity
を登録してから、そのアクティビティにOnActivityResult()
を使用する必要があります。
アクティビティからstartActivityForResultメソッドを使用してアクティビティを開始すると、呼び出し元のみが結果を受け取ります。
したがって、結果を処理してタスクに渡すか、そのアクティビティのUIを更新できます。
int MY_REQUEST_ID = 1;
public void onClick(){
//Select a contact.
startActivityForResult(
new Intent(Intent.ACTION_PICK,
new Uri("content://contacts")),
MY_REQUEST_ID);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCose == MY_REQUEST_ID && resultCode == SUCCESS) {
MyAsyncTask task = new AsyncTask(requestCode, resultCode, data);
task.execute();
// or update the UI
textView.setText("Hi, activity result: "+ resultCode);
}
}
私はこのように使用していますこれは他の人に役立つかもしれません
私のフラグメントでは
// Upload Cover Photo On Button Click
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Start The Image Cropper And Go To onActivityResult
Intent intent = ImageManager.startImageCropper(getContext());
startActivityForResult(intent, CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE);
}
});
次に、フラグメントでこのような結果を呼び出します
// On Activity Result for Start Activity For Result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Get The Image From Image Cropper
Uri resultUri = ImageManager.activityResult(requestCode, resultCode, data, getContext());
}
これらをサポートするパブリッククラス/関数は
public class ImageManager {
// Start Image Cropper
public static Intent startImageCropper(Context context) {
// Crop Image
Intent intent = CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.setActivityTitle("Title")
.setCropMenuCropButtonTitle("Save")
.setAutoZoomEnabled(true)
.setAspectRatio(1, 1)
.getIntent(context);
return intent;
}
public static Uri activityResult(int requestCode, int resultCode, Intent data, Context context) {
// Handle Cropped Image
Uri resultUri = null;
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == Activity.RESULT_OK) {
resultUri = result.getUri();
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
Toast.makeText(context, (CharSequence) error, Toast.LENGTH_SHORT).show();
}
}
return resultUri;
}
}