Bagaimana cara menggunakan satu antarmuka di banyak kelas di java?

Saya memiliki satu aktivitas dan 2 fragmen.

Saya ingin ketika dalam aktivitas api listener.receivePreview(obj) lalu

  1. jalankan : OneFragment -> terimaPreview .
  2. jalankan : TwoFragment -> receiverPreview .
public class MainAct extends AppCompatActivity {
    public interface OnReceiveListener {
        // This can be any number of events to be sent to the activity
        void receivePreview(Object... obj);
    }
    private OnReceiveListener listener;


}

public class OneFragment extends Fragment implements OnReceiveListener{

    @Override
    public void receivePreview(Object... obj) {

    }
}

public class TwoFragment extends Fragment implements OnReceiveListener{

    @Override
    public void receivePreview(Object... obj) {

    }
}

person Ahmad Aghazadeh    schedule 27.05.2016    source sumber
comment
Bisakah Anda menjelaskan lebih jelas, apa sebenarnya yang ingin Anda capai? Selain itu, jika Anda menginginkan satu antarmuka, mengapa Anda mengimplementasikannya di kedua Fragmen?   -  person Abdul Fatir    schedule 27.05.2016
comment
Coba pustaka eventbus greenrobots andreas -schrade.de/2015/11/28/   -  person akhil Rao    schedule 27.05.2016


Jawaban (3)


Saya pikir Anda dapat menggunakan Pola Pengamat yang merupakan praktik yang baik dalam situasi Anda.

Seperti yang dijelaskan oleh GoF:

Tentukan ketergantungan satu-ke-banyak antar objek sehingga ketika satu objek berubah status, semua dependennya akan diberitahu dan diperbarui secara otomatis.

Baca selengkapnya di http://www.java2blog.com/2013/02/observer-design-pattern-in-java.html#TLio7G2ruqxvfZUR.99

Dalam situasi Anda, Anda memiliki hubungan seperti itu (satu-ke-banyak) dan ketika suatu peristiwa terjadi dalam aktivitas Anda ingin mengetahui dua fragmen itu.

masukkan deskripsi gambar di sini

Fragmen adalah implementasi kelas pengamat dan aktivitas Anda memiliki peran subjek seperti yang diilustrasikan pada gambar di atas.

Saya harap ini dapat membantu Anda mengimplementasikan kode Anda dengan cara yang sangat baik. beberapa tutorial dapat ditemukan di link berikut :

https://dzone.com/articles/observer-pattern-java http://www.tutorialspoint.com/design_pattern/observer_pattern.htm

Sunting: dalam situasi tertentu:

public interface OnReceiveListener { // this is your observer interface  !
        // This can be any number of events to be sent to the activity
        void receivePreview(Object... obj);
    }

Fragmen berada dalam definisi yang benar dengan pola desain ini jadi saya tidak mengubah kodenya:

public class OneFragment extends Fragment implements OnReceiveListener{

@Override
public void receivePreview(Object... obj) {

}
}

public class TwoFragment extends Fragment implements OnReceiveListener{

@Override
public void receivePreview(Object... obj) {

}

Anda perlu memiliki referensi ke bagian-bagian dalam aktivitas (sebagai pengamat).

ArrayList< OnReceiveListener > observers =  new ArrayList< OnReceiveListener>();

memang seorang pengamat dapat berlangganan atau mendaftarkan dirinya ke suatu subjek (fragmen menyimpan referensi ke aktivitas tersebut (lebih baik menggunakan pola tunggal! :D). seperti ini :

public class MainAct extends AppCompatActivity {
private static MainAct instance;

public static MainAct getInstance() {
 if(instance != null)
    return instance;
}

// I think it is better to create the instance variable in the onCreate() method of the MainAct activity

onCreate(...)
{
.
.
.
instance = this;
...
}

public void registerObserver(OnReceiveListener observer){
observers.add(observer)
}
/* To avoid memory leaks, remember to unregister receivers when no longer observing */
public void unregisterObserver(OnReceiveListener observer) {
    observers.remove(observer);
}
notifyObservers(){
// call this method in the listener you want 

for( Observer obser : observers)
    obser. receivePreview(param )

}
...

//in fragment initialization: 
MainAct.getInstance().registerObserver(this)
person Sir1    schedule 27.05.2016
comment
Saya setuju dengan penilaian Anda, mungkin berguna untuk memberikan contoh bagaimana hal ini dapat digunakan dalam situasi tertentu. - person cyroxis; 27.05.2016
comment
Saya setuju dengan Anda, menurut saya pola desain adalah konsep yang harus digunakan dalam situasi yang tepat. tapi pertama-tama kita perlu mempelajari apa itu pola desain dan mengapa kita akan menggunakannya. dalam situasi ini sudah cukup jelas tetapi saya akan mengedit jawaban saya untuk memberikan contoh yang tepat. - person Sir1; 27.05.2016
comment
@ahmadaghazadeh Ghorbanat :)) - person Sir1; 27.05.2016
comment
Terima kasih. Silakan lihat solusi saya. - person Ahmad Aghazadeh; 27.05.2016

Saya menggunakan jawaban Sirvan Paraste. Tampaknya solusi ini bermanfaat.

    public class MainAct extends AppCompatActivity {

         static List<OnReceiveListener> onReceiveList = new ArrayList<OnReceiveListener>();

        public void attachOnReceiveListener(OnReceiveListener listener) {
            if (!onReceiveList.contains(listener)) {
                onReceiveList.add(listener);
            }
        }

        public interface OnReceiveListener {
            // This can be any number of events to be sent to the activity
            void receivePreview(Object... obj);
        }

        public onReceivePreview(Object... obj) {
                 for (OnReceiveListener listener : onReceiveList) {
                    listener.receivePreview(obj);
                }
        }
     }

    public class OneFragment extends Fragment implements OnReceiveListener{


        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            MainAct  mainAct = new MainAct();
            mainAct.attachOnReceiveListener(this);

        }

        @Override
        public void receivePreview(Object... obj) {

        }
    }

    public class TwoFragment extends Fragment implements OnReceiveListener{

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            MainAct  mainAct = new MainAct();
            mainAct.attachOnReceiveListener(this);

        }
        @Override
        public void receivePreview(Object... obj) {

        }
    }
person Ahmad Aghazadeh    schedule 27.05.2016

Cobalah untuk membuat satu fungsi di setiap fragmen yang mengembalikan instance antarmuka

public OnReceiveListener getListener() {
    mListener = this;
    return mListener
}

dan dalam aktivitas Anda saat memanggil metode, tulis kode berikut

fragmentInstance.getListener().receivePreview();
person mdDroid    schedule 27.05.2016