Bagaimana cara membuat antarmuka Pendengar kita sendiri di android?

134

Bisakah seseorang membantu saya membuat antarmuka pendengar yang ditentukan pengguna dengan beberapa cuplikan kode?

Rajapanda
sumber

Jawaban:

198

Buat file baru:

MyListener.java:

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

Dalam aktivitas Anda, terapkan antarmuka:

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
    }
}

Di kelas khusus Anda, aktifkan antarmuka saat diperlukan:

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");
    }
}
Rakesh Soni
sumber
2
Bagaimana cara melewatkan Objek Pendengar jika Tombol kita sudah ada dalam tata letak dan bukannya kita tidak menggunakan MyButton m = new MyButton (ini); cara membuat objek Button.
Qadir Hussain
2
Anda dapat menambahkan metode baru di kelas MyButton: void setMyListener (MyListner m1) {this.ml = m1;} dan kemudian menggunakan metode ini kapan saja untuk mengatur objek pendengar Anda.
Rakesh Soni
1
di mana MyLogicToInalueOthere () metode ini digunakan?
abh22ishek
1
Berasal dari latar belakang iOS, jika saya melakukan ini di iOS itu akan menyebabkan kebocoran memori karena pendengar MyButton adalah referensi yang kuat untuk pendengar, dan pendengar memiliki referensi kuat ke MyButton ... adalah pengumpul sampah java cukup pintar untuk tahu bahwa pendengar dan MyButton harus dibersihkan jika tidak ada referensi ke pendengar yang tersisa selain dari MyButton? Anda dapat menggunakan a WeakReference<>dalam hal ini, tetapi kemudian Anda tidak dapat membuat pendengar menjadi kelas anonim atau apa pun di mana pendengar tidak memiliki referensi lain ... jadi akan lebih baik jika tidak menggunakannya
Fonix
mana MyLogicToIntimateOthers () digunakan
Ab
109

tolong baca pola pengamat

antarmuka pendengar

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

maka di kelas Anda katakan Eventkelas

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 :)
    }
}

di kelas pengemudi Anda 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();
    }
}
Rupesh
sumber
11

Saya telah membuat Generic AsyncTask Listener yang mendapatkan hasil dari kelas terpisah AsycTask dan memberikannya ke CallingActivity menggunakan Interface Callback.

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

Antarmuka

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

Lihat ini , pertanyaan ini untuk lebih jelasnya.

Xar-e-ahmer Khan
sumber
8

Ada 4 langkah:

1. buat kelas antarmuka (pendengar)

2.menggunakan antarmuka dalam tampilan 1 (define variabel)

3. menambahkan antarmuka untuk melihat 2 (tampilan 1 digunakan dalam tampilan 2)

4. masukkan antarmuka dalam tampilan 1 ke tampilan 2

Contoh:

Langkah 1: Anda perlu membuat antarmuka dan fungsi definde

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

Langkah 2: gunakan antarmuka ini dalam tampilan

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

Langkah 3,4: menerapkan aktivitas

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);
    }
}
Rasoul Miri
sumber
7

Buat antarmuka pendengar.

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

Dan buat metode setOnCustomClick di aktivitas lain (atau fragmen), tempat Anda ingin menerapkan pendengar khusus Anda ......

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

Panggil metode ini dari Aktivitas pertama Anda, dan sampaikan antarmuka pendengar ...

Kapil Vij
sumber
4

Pada tahun 2018, tidak perlu antarmuka pendengar. Anda memiliki Android LiveData untuk menjaga agar hasil yang diinginkan dikembalikan ke komponen UI.

Jika saya akan mengambil jawaban Rupesh dan menyesuaikannya untuk menggunakan LiveData, akan seperti ini:

public class Event {

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

         // and in the end

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

dan sekarang di kelas driver Anda 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.
            }
        });
    }
}

Untuk informasi lebih lanjut bersama dengan contoh kode Anda dapat membaca posting saya tentang hal itu, serta dokumen resmi:

Kapan dan mengapa menggunakan LiveData

Dokumen resmi

TheCodeFather
sumber
0

Di Android, Anda dapat membuat antarmuka seperti Listener, dan Aktivitas Anda mengimplementasikannya, tetapi saya rasa itu bukan ide yang baik. jika kita memiliki banyak komponen untuk mendengarkan perubahan statusnya, kita dapat membuat BaseListener mengimplementasikan antarmuka Listener, dan menggunakan kode jenis untuk menanganinya. kita dapat mengikat metode ketika kita membuat file XML, misalnya:

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

dan kode sumber:

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

tapi saya rasa itu bukan ide yang bagus ...

pengguna3055973
sumber
0

Saya telah melakukan sesuatu seperti di bawah ini untuk mengirim kelas model saya dari Aktivitas Kedua ke Aktivitas Pertama. Saya menggunakan LiveData untuk mencapai ini, dengan bantuan jawaban dari Rupesh dan TheCodeFather.

Aktivitas kedua

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

"liveSong" adalah AudioListModel yang dideklarasikan secara global

Panggil metode ini di Aktivitas Pertama

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

Semoga ini membantu penjelajah baru seperti saya.

Deepak J
sumber
-4

Metode sederhana untuk melakukan pendekatan ini. Pertama mengimplementasikan OnClickListenersdi kelas Activity Anda.

Kode:

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;
        }
    }
}
Rishabh Rawat
sumber