PDA

View Full Version : مشکل در onActivityResult



samiasoft
چهارشنبه 21 شهریور 1397, 21:44 عصر
سلام دوستان


فرض کنید یک کلاسی داریم که داخلش یک تابع داره...این کلاس اکستند شده از اکتیوتی هست.


میخواهیم این تابع موجود در داخل این کلاس رو اجرا کنیم و ریزالتشو دریافت کنیم


پس در ماین اکتیوتی یک نمونه از این کلاس بدین صورت ساختم و تابع مربوطه رو اجرا کردیم :

update update=new update(this);


update.start();

هنگام اجرای این تابع گالری اجرا میشه و کاربر وقتی فایلشو انتخاب کرد باید ریزالت بده بهم ولی نمیده چرا هیچ ریزالتی نمایش نمیده !

به نظرتون مشکل از کجاست؟
نمیخواهم این ریزالت رو داخل ماین اکتیوتی بیارم وگرنه دراین حالت خب کار میکنه...من میخواستم حتماداخل این کلاس ریزالت رو بگیرم.

public class update extends Activity {


Activity activity;


public update(Activity activity) {
this.activity = activity;
}


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



if (resultCode == RESULT_OK){



if (requestCode == 1 ) {

Toast.makeText(activity.getApplicationContext(),"ok",Toast.LENGTH_SHORT).show();


}
}

}
public void start(){


Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);


photoPickerIntent.setType("image/* video/*");


activity.startActivityForResult(photoPickerIntent, 1);
}


}

JYasProgramer
جمعه 23 شهریور 1397, 09:55 صبح
سلام میشه بفرمایید هدف نهاییت چیه؟
چه فرقی داره ریزالت به مای اکتیویتی بره یا به کلاسی که میخایی؟

samiasoft
جمعه 23 شهریور 1397, 13:37 عصر
سلام میشه بفرمایید هدف نهاییت چیه؟
چه فرقی داره ریزالت به مای اکتیویتی بره یا به کلاسی که میخایی؟

کار خاصی که نمیخواستم انجام بدم درواقع میخواستم این حالت رو تست کنم شاید زمانی به درد خورد :لبخند:

ولی الان همیشه ریزالت رو به ماین اکیتویتی میفرسته هرکار کردم به خود کلاس نفرستاد...نمیدانم اشکالش کجاست

JYasProgramer
شنبه 24 شهریور 1397, 10:55 صبح
ببینید در هر لحظه تنها یک activity روی صفه گوشی فعاله
وقتی شما update رو زیر کلاس activity قرار دادین ینی دیگه مای اکتیویتی فعال نیست
پس داده دریافتی تنها در update دریافت میشه

farhad_shiri_ex
شنبه 24 شهریور 1397, 15:14 عصر
سلام دوستان


فرض کنید یک کلاسی داریم که داخلش یک تابع داره...این کلاس اکستند شده از اکتیوتی هست.


میخواهیم این تابع موجود در داخل این کلاس رو اجرا کنیم و ریزالتشو دریافت کنیم


پس در ماین اکتیوتی یک نمونه از این کلاس بدین صورت ساختم و تابع مربوطه رو اجرا کردیم :

update update=new update(this);


update.start();

هنگام اجرای این تابع گالری اجرا میشه و کاربر وقتی فایلشو انتخاب کرد باید ریزالت بده بهم ولی نمیده چرا هیچ ریزالتی نمایش نمیده !

به نظرتون مشکل از کجاست؟
نمیخواهم این ریزالت رو داخل ماین اکتیوتی بیارم وگرنه دراین حالت خب کار میکنه...من میخواستم حتماداخل این کلاس ریزالت رو بگیرم.

public class update extends Activity {


Activity activity;


public update(Activity activity) {
this.activity = activity;
}


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



if (resultCode == RESULT_OK){



if (requestCode == 1 ) {

Toast.makeText(activity.getApplicationContext(),"ok",Toast.LENGTH_SHORT).show();


}
}

}
public void start(){


Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);


photoPickerIntent.setType("image/* video/*");


activity.startActivityForResult(photoPickerIntent, 1);
}


}

اگر یک کلاس پوشاننده تعریف کنید قاعدتا باید بتونید کاری که می خواهید انجام بدید!
البته این کدها را تو یک ادیتور نوشتم چون دسترسی به ویندوز و اندروید استودیو نداشتم تست نکردم ببخشید اگر اشتباهی داشت! ولی یک روش با استفاده از درخت وراثت همین هست.

class Main extends Activity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}

}

class Update extends Main {

Update(Context self){
super(self);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
if (requestCode == 1 )
Toast.makeText(activity.getApplicationContext(),"o k",Toast.LENGTH_SHORT).show();


}

}

class MainActivity extends Main {

MainActivity(Context self){
super(self);
}

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

}

hatamiam
سه شنبه 27 شهریور 1397, 11:53 صبح
سلام

شما اول یک interface به اسم IGalleryResult بساز مثل زیر

public interface IGalleryResult {
void result(String patch);
void cancel();
}

حالا متد استارتت را جایگزین کد زیر کن
public void start(IGalleryResult galleryResult){
this.galleryResult=galleryResult;


Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);




photoPickerIntent.setType("image/* video/*");




activity.startActivityForResult(photoPickerIntent, 1);
}

داخل اکتیویتی Update هم ی شی از IGalleryResult باید بسازی
حالا قسمتی که متد Start را صدا میزنی توی ورودی IGalleryResult را نیو میکنی و داخل اکتیویتی ‌Update داخل متد onActivityResult از شی که از IGallertResult ساختی استفاده میکنی
دیگ هم داخل MianActivity نیازی نیست که onActivityResult را بررسی کنی

MrP.k
سه شنبه 27 شهریور 1397, 15:42 عصر
دوست عزیز وقتی یه کلاس از اکتیویتی ارث میبره برای اجرای اون نباید اون رو new کرد
باید intent تعریف کرد و اون رو استارت کرد
وقتی این کار رو انجام ندادی طبیعا اکتیویتی ران نشده که بخواد ریزالت داشته باشه
این از مشکل ریزالت
برای گرفتن عکس هم بهتره کدی که داخل تابع start نوشتید رو داخل هر اکتیویتی که میخواید عکس رو بگیرید بزارید و توی متد onresult چک کنید چه عکسهایی انتخاب شده
در نهایت میتونی از این لایبرای استفاده کنی
https://github.com/kimlet/AndroidImagePicker
موفق باشی