بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

ارسال اینترفیس (interface) توسط intent به یک اکتیویتی (حل نشده)

مدیریت گفتگو
سپهر 11 سال پیش
آخرین تغییر: 11 سال پیش

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

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

آیا این امکان وجود داره؟

نظرات

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

پاسخ‌ها 3

سپهر 11 سال پیش

من یک کلاس دارم که همون اینترفیسم هست

 



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

 

نظرات

Hajhosseini 11 سال پیش

ببینید این نمونه کدی هست که استاد توی آموزش ماژول وب سرویس استفاده کردن
در کلاس 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);
                    }
                }

نظرات

سپهر 11 سال پیش
ممنون از مثال شما ، من هم از همین روش استفاده می کنم اما کاری که من میخوام بکنم این هست که لیسنر رو در کلاس override کنم نه در اکتیویتی ، و در اکتیویتی فقط مقداردهیش کنم که جوابش رو در کلاس لاگ کنم ، که در این صورت یا باید لیسنر رو استاتیک تعریف کنم تا در اکتیویتی بهش دسترسی داشته باشم یا باید با اینتنت لیسنرمو پاس بدم به اکتیویتی
کاشی زاده 11 سال پیش
لیسنر رو میتوید به صورت نستد درون یک کلاس تعریف کنید و در کلاس های دیگه صداش بزنید .
سپهر 11 سال پیش
متوجه منظورتون نشدم لطف میکنی بیشتر توضیح بدی
سپهر 11 سال پیش
البته فعلن در حال حاضر مجبور شدم لیسنرم رو پکیج استاتیک تعریف کنم تا یک راه حل بهتری براش پیدا کنم
Hajhosseini 11 سال پیش
میتونید براش متد Get ، Set بنویسید و از اکتیویتی مقداردهی کنید، یا میتونید پارامتر ورودی به کانستراکتور بدید در مورد قسمت اول هم شما از هر جایی میتونید این اینترفیس رو فراخوانی کنید، توی هر کلاسی هم میتونید لاگ ارسال کنید.
کاشی زاده 11 سال پیش

شما میتونید در کلاس مثلا 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) {

}
};

}
}

 

نظرات

سپهر 11 سال پیش
متوجه منظور من نشدید ، من نمیخوام لیسنر جدیدی new کنم میخوام از همون لیسنر ساخته شده در کلاس ، داخل اکتیویتی مقداردهی کنم

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .