بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
ارسال اینترفیس (interface) توسط intent به یک اکتیویتی (حل نشده)
مدیریت گفتگو
آخرین تغییر: 11 سال پیش
من یک اینترفیسی دارم که به عنوان listener ازش استفاده میکنم
میخوام این اینترفیسمو از داخل یک کلاس پاس بدم به اکتیویتی و اونجا مقدار دهی کنم و داخل کلاسم اون رو گسترش بدم
آیا این امکان وجود داره؟
پاسخها 3
من یک کلاس دارم که همون اینترفیسم هست
public interface OnCloseListener {
public void closed(boolean skiped);
}
و یک کلاس دارم که از طریق اون میخوام اینتنت بفرستم
OnCloseListener sn = new OnCloseListener() {
@Override
public void closed(boolean skiped) {
// TODO Auto-generated method stub
Log.i("TRACE", skiped + "$$$$$$$$$$$$$$$$$$$$");
}
};
intent.putExtra("signal", sn);
_context.startActivity(intent);
و اکتیویتی دارم که اینتنتو میگیره و مقدار دهی میکنه
onCloseListener = (OnCloseListener) getIntent().getSerializableExtra("signal");
onCloseListener.closed(true);
نظرات
ببینید این نمونه کدی هست که استاد توی آموزش ماژول وب سرویس استفاده کردن
در کلاس ModuleWebservice
public static interface Listener {
public void onDataReceive(String data);
public void onFail(int statusCode);
}
در اکتیویتی
ModuleWebservice module = new ModuleWebservice();
ModuleWebservice.Listener listener = new ModuleWebservice.Listener() {
@Override
public void onDataReceive(String data) {
Log.i("LOG", "Webservice Data: " + data);
}
@Override
public void onFail(int statusCode) {
switch (statusCode) {
case ModuleWebservice.IO_EXCEPTION:
Log.i("LOG", "IO Exception");
break;
case ModuleWebservice.PROTOCOL_EXCEPTION:
Log.i("LOG", "PROTOCOL Exception");
break;
case ModuleWebservice.UNKNOWN_EXCEPTION:
Log.i("LOG", "UNKNOWN Exception");
break;
}
}
};
و در کلاس ModuleWebservice دیتا به این صورت پاس داده میشه
if (listener != null) {
listener.onDataReceive(data);
return;
}
یا
catch (ClientProtocolException e) {
if (listener != null) {
listener.onFail(PROTOCOL_EXCEPTION);
}
}
catch (IOException e) {
if (listener != null) {
listener.onFail(IO_EXCEPTION);
}
}
catch (Exception e) {
if (listener != null) {
listener.onFail(UNKNOWN_EXCEPTION);
}
}
نظرات
ممنون از مثال شما ، من هم از همین روش استفاده می کنم اما کاری که من میخوام بکنم این هست که لیسنر رو در کلاس override کنم نه در اکتیویتی ، و در اکتیویتی فقط مقداردهیش کنم که جوابش رو در کلاس لاگ کنم ، که در این صورت یا باید لیسنر رو استاتیک تعریف کنم تا در اکتیویتی بهش دسترسی داشته باشم یا باید با اینتنت لیسنرمو پاس بدم به اکتیویتی
لیسنر رو میتوید به صورت نستد درون یک کلاس تعریف کنید و در کلاس های دیگه صداش بزنید .
متوجه منظورتون نشدم لطف میکنی بیشتر توضیح بدی
البته فعلن در حال حاضر مجبور شدم لیسنرم رو پکیج استاتیک تعریف کنم تا یک راه حل بهتری براش پیدا کنم
میتونید براش متد Get ، Set بنویسید و از اکتیویتی مقداردهی کنید، یا میتونید پارامتر ورودی به کانستراکتور بدید
در مورد قسمت اول هم شما از هر جایی میتونید این اینترفیس رو فراخوانی کنید، توی هر کلاسی هم میتونید لاگ ارسال کنید.
شما میتونید در کلاس مثلا A یک اینترفیس به صورت نستد تعریف کنید به شکل زیر :
public class A {
public interface interfaceA {
public void getName(String name);
}
}
بعد میتونید در یک کلاس دیگه و یا یک اکتیوتی دیگه از این اینترفیس استفاده کنید حالا یا متدش رو صدا کنید و خبری بدید و یا خبری رو بگیرید .
public class B extends Activity {
private interfaceA listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
listener = new interfaceA() {
@Override
public void getName(String name) {
}
};
}
}
نظرات
متوجه منظور من نشدید ، من نمیخوام لیسنر جدیدی new کنم میخوام از همون لیسنر ساخته شده در کلاس ، داخل اکتیویتی مقداردهی کنم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام
نظرات