Jawaban:
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");
}
}
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
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();
}
}
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.
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);
}
}
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 ...
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:
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 ...
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.
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;
}
}
}