Android'de kendi Dinleyici arayüzümüzü nasıl oluşturabilirim?


135

Birisi, bazı kod parçacıklarıyla kullanıcı tanımlı dinleyici arayüzü oluşturmama yardım edebilir mi?

Yanıtlar:


198

Yeni bir dosya oluşturun:

MyListener.java:

public interface MyListener {
    // you can define any parameter as per your requirement
    public void callback(View view, String result);
}

Etkinliğinizde arayüzü uygulayın:

MyActivity.java:

public class MyActivity extends Activity implements MyListener {
   @override        
   public void onCreate(){
        MyButton m = new MyButton(this);
   }

    // method is invoked when MyButton is clicked
    @override
    public void callback(View view, String result) {   
        // do your stuff here
    }
}

Özel sınıfınızda, gerektiğinde arayüzü çağırın:

MyButton.java:

public class MyButton {
    MyListener ml;

    // constructor
    MyButton(MyListener ml) {
        //Setting the listener
        this.ml = ml;
    }

    public void MyLogicToIntimateOthers() {
        //Invoke the interface
        ml.callback(this, "success");
    }
}

2
Eğer Düğmemiz zaten düzen içindeyse, Dinleyici Nesnesi nasıl iletilir, bunun yerine MyButton m = new MyButton (this); Button nesnesini oluşturmanın yolu.
Qadir Hussain

2
MyButton sınıfına yeni bir yöntem ekleyebilir: void setMyListener (MyListner m1) {this.ml = m1;} ve ardından bu yöntemi dinleyici nesnenizi ayarlamak için istediğiniz zaman kullanabilirsiniz.
Rakesh Soni

1
MyLogicToIntimateOthere () bu yöntem nerede kullanılır?
abh22ishek

1
Bir iOS arka planından geliyorsa, bunu iOS'ta yaparsam bellek sızıntısına neden olur çünkü MyButton'ın dinleyicisi dinleyiciye güçlü bir referanstır ve dinleyicinin MyButton'a güçlü bir referansı vardır ... java çöp toplayıcı MyButton dışında dinleyiciye hiçbir referans kalmadıysa, hem dinleyicinin hem de MyButton'ın temizlenmesi gerektiğini biliyor musunuz? WeakReference<>Bu durumda bir kullanabilirsiniz , ancak o zaman dinleyiciyi anonim bir sınıf veya dinleyicinin başka referansı olmayan herhangi bir şey yapamazsınız ... bu yüzden onu kullanmamak tercih edilir
Fonix

Burada () kullanılan MyLogicToIntimateOthers olduğunu
Ab

109

lütfen gözlemci desenini okuyun

dinleyici arayüzü

public interface OnEventListener {
    void onEvent(EventResult er);
    // or void onEvent(); as per your need
}

Daha sonra sınıf diyelim de Eventsınıfta

public class Event {
    private OnEventListener mOnEventListener;

    public void setOnEventListener(OnEventListener listener) {
        mOnEventListener = listener;
    }

    public void doEvent() {
        /*
         * code code code
         */

         // and in the end

         if (mOnEventListener != null)
             mOnEventListener.onEvent(eventResult); // event result object :)
    }
}

sürücü sınıfında MyTestDriver

public class MyTestDriver {
    public static void main(String[] args) {
        Event e = new Event();
        e.setOnEventListener(new OnEventListener() {
             public void onEvent(EventResult er) {
                 // do your work. 
             }
        });
        e.doEvent();
    }
}

11

AsycTask seperate sınıfından sonuç alan ve Interface Callback kullanarak CallingActivity'ye veren bir Generic AsyncTask Listener oluşturdum.

new GenericAsyncTask(context,new AsyncTaskCompleteListener()
        {
             public void onTaskComplete(String response) 
             {
                 // do your work. 
             }
        }).execute();

Arayüz

interface AsyncTaskCompleteListener<T> {
   public void onTaskComplete(T result);
}

GenericAsyncTask

class GenericAsyncTask extends AsyncTask<String, Void, String> 
{
    private AsyncTaskCompleteListener<String> callback;

    public A(Context context, AsyncTaskCompleteListener<String> cb) {
        this.context = context;
        this.callback = cb;
    }

    protected void onPostExecute(String result) {
       finalResult = result;
       callback.onTaskComplete(result);
   }  
}

Göz at Bu , bu soruyu daha fazla ayrıntı için.


8

4 adım vardır:

1. arayüz sınıfı (dinleyici) oluşturun

2. görünüm 1'de arayüzü kullanın (değişken tanımlayın)

3. görünüm 2 için arayüz uygular (görünüm 1, görünüm 2'de kullanılır)

4. görünüm 1'den görünüm 2'ye geçiş arabirimi

Misal:

Adım 1: Arayüz ve definde işlevi oluşturmanız gerekir

public interface onAddTextViewCustomListener {
    void onAddText(String text);
}

Adım 2: Bu arayüzü görünümde kullanın

public class CTextView extends TextView {


    onAddTextViewCustomListener onAddTextViewCustomListener; //listener custom

    public CTextView(Context context, onAddTextViewCustomListener onAddTextViewCustomListener) {
        super(context);
        this.onAddTextViewCustomListener = onAddTextViewCustomListener;
        init(context, null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context, attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        //call listener
        onAddTextViewCustomListener.onAddText("this TextView added");
    }
}

Adım 3,4: Aktiviteye uygular

public class MainActivity extends AppCompatActivity implements onAddTextViewCustomListener {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //get main view from layout
        RelativeLayout mainView = (RelativeLayout)findViewById(R.id.mainView);

        //create new CTextView and set listener
        CTextView cTextView = new CTextView(getApplicationContext(), this);

        //add cTextView to mainView
        mainView.addView(cTextView);
    }

    @Override
    public void onAddText(String text) {
        Log.i("Message ", text);
    }
}

7

Dinleyici arayüzü oluşturun.

public interface YourCustomListener
{
    public void onCustomClick(View view);
            // pass view as argument or whatever you want.
}

Ve özel dinleyicinizi uygulamak istediğiniz başka bir aktivitede (veya parçada) setOnCustomClick yöntemini oluşturun ......

  public void setCustomClickListener(YourCustomListener yourCustomListener)
{
    this.yourCustomListener= yourCustomListener;
}

Bu yöntemi İlk etkinliğinizden çağırın ve dinleyici arayüzünü geçin ...


4

2018 yılında dinleyici arayüzlerine ihtiyaç yoktur. İstenilen sonucu UI bileşenlerine geri iletmek için Android LiveData'ya sahipsiniz.

Rupesh'in cevabını alır ve LiveData'yı kullanacak şekilde ayarlarsam, şöyle olacaktır:

public class Event {

    public LiveData<EventResult> doEvent() {
         /*
          * code code code
          */

         // and in the end

         LiveData<EventResult> result = new MutableLiveData<>();
         result.setValue(eventResult);
         return result;
    }
}

ve şimdi sürücü sınıfınızda MyTestDriver:

public class MyTestDriver {
    public static void main(String[] args) {
        Event e = new Event();
        e.doEvent().observe(this, new  Observer<EventResult>() {
            @Override
            public void onChanged(final EventResult er) {
                // do your work.
            }
        });
    }
}

Kod örnekleriyle birlikte daha fazla bilgi için, bu konudaki yazımı ve resmi belgeleri okuyabilirsiniz:

LiveData ne zaman ve neden kullanılmalı

Resmi belgeler


0

Android'de Dinleyici gibi bir arayüz oluşturabilirsiniz ve Aktiviteniz onu uygular, ancak bunun iyi bir fikir olduğunu düşünmüyorum. durumlarının değişikliklerini dinleyecek çok sayıda bileşenimiz varsa, bir BaseListener arabirim Dinleyicisi uygulayabilir ve bunları işlemek için tür kodunu kullanabiliriz. XML dosyası oluşturduğumuzda yöntemi bağlayabiliriz, örneğin:

<Button  
        android:id="@+id/button4"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="Button4"  
        android:onClick="Btn4OnClick" />

ve kaynak kodu:

 public void Btn4OnClick(View view) {  
        String strTmp = "点击Button04";  
        tv.setText(strTmp);  
    }  

ama bunun iyi bir fikir olduğunu düşünmüyorum ...


0

Model sınıfımı İkinci Aktiviteden Birinci Aktiviteye göndermek için aşağıdaki gibi bir şey yaptım. Rupesh ve TheCodeFather'dan gelen cevapların yardımıyla bunu başarmak için LiveData kullandım.

İkinci Aktivite

public static MutableLiveData<AudioListModel> getLiveSong() {
        MutableLiveData<AudioListModel> result = new MutableLiveData<>();
        result.setValue(liveSong);
        return result;
    }

"liveSong", AudioListModel'in global olarak beyan edilmesidir

İlk Aktivitede bu yöntemi çağırın

PlayerActivity.getLiveSong().observe(this, new Observer<AudioListModel>() {
            @Override
            public void onChanged(AudioListModel audioListModel) {
                if (PlayerActivity.mediaPlayer != null && PlayerActivity.mediaPlayer.isPlaying()) {
                    Log.d("LiveSong--->Changes-->", audioListModel.getSongName());
                }
            }
        });

Bu benim gibi yeni kaşifler için yardımcı olabilir.


-4

Bu yaklaşımı yapmanın basit yöntemi. Öncelikle OnClickListenersActivity sınıfınızda uygular .

Kod:

class MainActivity extends Activity implements OnClickListeners{

protected void OnCreate(Bundle bundle)
{    
    super.onCreate(bundle);    
    setContentView(R.layout.activity_main.xml);    
    Button b1=(Button)findViewById(R.id.sipsi);    
    Button b2=(Button)findViewById(R.id.pipsi);    
    b1.SetOnClickListener(this);    
    b2.SetOnClickListener(this);    
}

public void OnClick(View V)    
{    
    int i=v.getId();    
    switch(i)    
    {    
        case R.id.sipsi:
        {
            //you can do anything from this button
            break;
        }
        case R.id.pipsi:
        {    
            //you can do anything from this button       
            break;
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.