จะใช้อินเทอร์เฟซเดียวในหลายคลาสใน java ได้อย่างไร?

ฉันมีหนึ่งกิจกรรมและ 2 ส่วน

ฉันต้องการเมื่ออยู่ในกิจกรรมไฟ listener.receivePreview(obj) แล้ว

  1. ดำเนินการ: OneFragment -> getsPreview
  2. ดำเนินการ: TwoFragment -> getsPreview
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 แหล่งที่มา
comment
คุณช่วยอธิบายให้ชัดเจนกว่านี้หน่อยได้ไหมว่าคุณต้องการบรรลุอะไรกันแน่? นอกจากนี้ หากคุณต้องการอินเทอร์เฟซเดียว ทำไมคุณถึงใช้อินเทอร์เฟซดังกล่าวใน Fragment ทั้งสอง?   -  person Abdul Fatir    schedule 27.05.2016
comment
ลองใช้ไลบรารี eventbus ของ greenrobots andreas -schrade.de/2015/11/28/   -  person akhil Rao    schedule 27.05.2016


คำตอบ (3)


ฉันคิดว่าคุณสามารถใช้ รูปแบบผู้สังเกตการณ์ ซึ่งเป็นแนวทางปฏิบัติที่ดีในสถานการณ์ของคุณได้

ตามที่อธิบายโดย GoF:

กำหนดการพึ่งพาแบบหนึ่งต่อกลุ่มระหว่างออบเจ็กต์ เพื่อที่ว่าเมื่อออบเจ็กต์หนึ่งเปลี่ยนสถานะ ผู้อยู่ในอุปการะทั้งหมดจะได้รับแจ้งและอัปเดตโดยอัตโนมัติ

อ่านเพิ่มเติมได้ที่ http://www.java2blog.com/2013/02/observer-design-pattern-in-java.html#TLio7G2ruqxvfZUR.99

ในสถานการณ์ของคุณ คุณมีความสัมพันธ์ดังกล่าว (แบบหนึ่งต่อกลุ่ม) และเมื่อมีเหตุการณ์เกิดขึ้นในกิจกรรมที่คุณต้องการทราบว่ามีสองส่วน

ป้อนคำอธิบายรูปภาพที่นี่

แฟรกเมนต์เป็นคลาสผู้สังเกตการณ์นำไปใช้ และกิจกรรมของคุณมีบทบาทเป็นหัวเรื่องดังแสดงในรูปด้านบน

ฉันหวังว่านี่จะช่วยให้คุณนำโค้ดของคุณไปใช้ในทางที่ดีมาก บทช่วยสอนบางส่วนสามารถพบได้ในลิงค์ต่อไปนี้:

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

แก้ไข: ในสถานการณ์ที่กำหนด:

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

แฟรกเมนต์มีคำจำกัดความที่ถูกต้องกับรูปแบบการออกแบบนี้ ดังนั้นฉันจึงไม่เปลี่ยนโค้ด:

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

}

คุณต้องมีการอ้างอิงถึงส่วนต่างๆ ในกิจกรรม (ในฐานะผู้สังเกตการณ์)

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

แน่นอนว่าผู้สังเกตการณ์สามารถสมัครสมาชิกหรือลงทะเบียนตัวเองในหัวข้อ ( ส่วนอ้างอิงถึงกิจกรรม (ควรใช้รูปแบบซิงเกิลตันดีกว่า :D) เช่นนี้:

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
ฉันเห็นด้วยกับการประเมินของคุณ การยกตัวอย่างว่าจะใช้รหัสนี้ในสถานการณ์ที่กำหนดได้อย่างไรอาจเป็นประโยชน์ - person cyroxis; 27.05.2016
comment
ฉันเห็นด้วยกับคุณ ฉันคิดว่ารูปแบบการออกแบบเป็นแนวคิดที่ควรใช้ในสถานการณ์ที่เหมาะสม แต่ในตอนแรกเราต้องเรียนรู้ว่า Design Pattern คืออะไร และเหตุใดเราจึงจะใช้มัน ในสถานการณ์นี้ชัดเจนเพียงพอ แต่ฉันจะแก้ไขคำตอบเพื่อให้เป็นตัวอย่างที่เหมาะสม - person Sir1; 27.05.2016
comment
@ahmadaghazadeh Ghorbanat :)) - person Sir1; 27.05.2016
comment
ขอบคุณ โปรดดูวิธีแก้ปัญหาของฉัน - person Ahmad Aghazadeh; 27.05.2016

ฉันใช้คำตอบ Sirvan Paraste ดูเหมือนว่าโซลูชันที่มีประโยชน์นี้

    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

พยายามสร้างหนึ่งฟังก์ชันในแต่ละแฟรกเมนต์ซึ่งส่งคืนอินสแตนซ์อินเทอร์เฟซ

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

และในกิจกรรมของคุณเมื่อคุณเรียกใช้เมธอดให้เขียนโค้ดต่อไปนี้

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