วิธีนำเข้าคลาสหนึ่งจากบิลด์รสชาติอื่น [ซ้ำกัน]

โครงสร้างโครงการของฉันมีลักษณะดังนี้

+ src
        + main // this is my common code
            + java 
                - LoginScreen // depending on condition launch screen from flavor1 or flavor2 
            + res
        + flavor1
            + java
            + res
        + flavor2
            + java
            + res

ฉันมีคลาสการเข้าสู่ระบบใน main/src ขึ้นอยู่กับเงื่อนไข ต้องเปิดหน้าจอจาก รส1 หรือ รส2

ตัวอย่างเช่น:

class LoginScreen{
......

    if(true){
        // launch ScreenUser from Flavor1 reset of screen flows from falvour1
    }else{
       // launch ScreenOTP from Flavor2 reset of screen flows from falvour2
    }
}

ในกรณีนี้ หากฉันสร้าง build สำหรับ รส1 มันแสดงข้อผิดพลาดสำหรับคลาส falvor2 และในทางกลับกัน

ทั้งสองรสชาติมี applicationId ที่แตกต่างกัน เช่น applicationIdSuffix ".flavor1"

เป็นไปได้ไหม? ถ้าไม่ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?


comment
หากคุณต้องเปิดใช้งานโดยพูดว่า UserScreen ให้ใส่ UserScreen.java ทั้งสองรสชาติและใส่การใช้งานที่เกี่ยวข้องลงไป จากนั้นเพียงโทรจาก LoginScreen ของคุณ   -  person gitter    schedule 05.01.2017
comment
ทำไมคุณไม่ระบุสิ่งนั้นโดยใช้รหัสแอปพลิเคชัน นั่นเป็นเอกลักษณ์   -  person M D    schedule 05.01.2017
comment
คุณกำลังพยายามเปิด ClassA ในรสชาติ 1 และคลาส B ในรสชาติ 2 หากเป็นจริงและในทางกลับกันหรือไม่ ในกรณีนั้น คุณควรเก็บทั้งสองคลาสไว้เป็นคลาสหลักและมีคลาสที่แตกต่างกันในทั้งสองรสชาติ ซึ่งจะตัดสินใจว่าจะเปิดตัวหน้าจอใดตามค่าที่คุณระบุ (เช่น จะเกิดอะไรขึ้นหากบล็อกเกิดขึ้น)   -  person gitter    schedule 05.01.2017


คำตอบ (2)


เมื่อฉันทำสิ่งนี้เสร็จแล้ว ฉันเคยใช้อินเทอร์เฟซและการฉีดการพึ่งพา (ฉันใช้ dagger) . สิ่งที่ต้องการ:

public interface LoginBehaviour {

    void goToNextScreen(Context context);
}

จากนั้นกำหนดการใช้งานในแต่ละรสชาติซึ่งมีโค้ดเพื่อเปิดหน้าจอถัดไป สิ่งที่ต้องการ:

public class FlavourOneLoginBehaviour implements LoginBehaviour {

    @Override
    public void goToNextScreen(Context context) {
        context.startActivity(new Intent(context, ScreenUser.class));
    }

}

และ:

public class FlavourTwoLoginBehaviour implements LoginBehaviour {

    @Override
    public void goToNextScreen(Context context) {
        context.startActivity(new Intent(context, ScreenOTP.class));
    }

}

คุณต้องตั้งค่าคอนเทนเนอร์การขึ้นต่อกันในแต่ละรสชาติเพื่อให้อ้างอิงถึงการใช้งานในพื้นที่ (ซึ่งจะแตกต่างกันไปขึ้นอยู่กับกรอบงานที่คุณใช้) หลังจากที่คุณดำเนินการดังกล่าวแล้ว คุณสามารถใช้คอนเทนเนอร์ในโปรเจ็กต์หลักเพื่อรับการใช้งานอินเทอร์เฟซ LoginBehavior ที่ถูกต้อง ณ รันไทม์ และคุณสามารถเรียก goToNextScreen เพื่อดำเนินการนำทางได้ การพึ่งพาการฉีดเป็นวิธีที่มีประโยชน์มากเพื่อให้แน่ใจว่าคุณสามารถสลับส่วนต่างๆ ของโค้ดได้โดยไม่ต้องทำการรีแฟคเตอร์ครั้งใหญ่ และช่วยได้มากในเรื่องการใช้ซ้ำและความยืดหยุ่น หวังว่าจะช่วยได้!

person GeordieMatt    schedule 05.01.2017
comment
ขอบคุณเพื่อน ฉันแก้ไขมันได้แล้วโดยใช้เจตนาโดยนัย - person N J; 05.01.2017
comment
@GeordieMatt เท่าที่ฉันเข้าใจ อินเทอร์เฟซถูกวางไว้ในรสชาติหลักและการใช้งานแต่ละครั้งในรสชาติตามลำดับ แต่ฉันไม่สามารถทราบได้ว่า DI ทำงานอย่างไรในการอ้างอิงการใช้งานในพื้นที่ คุณจะแชร์ข้อมูลโค้ดของการตั้งค่าคอนเทนเนอร์การขึ้นต่อกันในแต่ละรสชาติหรือไม่ - person Charan; 28.02.2018
comment
@Charan ทางออกที่ดีที่สุดของคุณคือเอกสารสำหรับกรอบงาน DI ของคุณ ฉันอยากจะแนะนำ Dagger สำหรับแอป Android (ลิงก์อยู่ในคำตอบ) - person GeordieMatt; 02.03.2018

หนึ่งในความเป็นไปได้ที่จะทำเช่นนั้น หากคุณต้องการมีเพียงคลาสเดียวที่มี if ที่ตรวจสอบ buildType/productFlavor ของคุณ คุณสามารถตั้งค่าฟิลด์ BuildConfig ใน buildTypes/productFlavors ทั้งสองได้โดยการเพิ่ม:

productFlavors {
  flavor1 {
    buildConfigField "String", "BUILD_FLAVOR", "Flavor1"
  }
  flavor2 {
    buildConfigField "String", "BUILD_FLAVOR", "Flavor2"
  }
}

จากนั้นคุณสามารถใช้มันในโค้ด:

class LoginScreen {
......

  switch(BuildConfig.BUILD_FLAVOR) {
    case "Flavor1":
      // launch ScreenUser from Flavor1
      break;
    case "Flavor2":
      // launch ScreenOTP from Flavor2
      break;
  }
}

หวังว่าฉันได้ช่วยแล้ว ขอให้โชคดี!

person NonGrate    schedule 05.01.2017
comment
ลองทำเช่นนี้เช่นกัน แต่มันแสดงข้อผิดพลาดในการคอมไพล์ในการนำเข้าสำหรับ ScreenUser หากฉันสร้าง build ด้วย flavour2 - person N J; 05.01.2017
comment
คุณช่วยเผยแพร่รายละเอียดข้อผิดพลาดในการคอมไพล์ที่นี่ได้ไหม น่าเสียดายที่ฉันไม่สามารถคาดเดาได้ว่ามีปัญหาอะไรเกิดขึ้นบ้าง ขอบคุณ! - person NonGrate; 05.01.2017
comment
มันทำให้ฉันมีข้อผิดพลาดในการนำเข้ากิจกรรมจากคำสั่งนำเข้า flavro1 Error:(17, 55) error: package com.mypackage.views.product_selection does not exist เนื่องจากกิจกรรมนี้มาจากอีกรสชาติหนึ่ง - person N J; 05.01.2017
comment
หากคุณต้องการใช้คลาสที่แตกต่างกันสำหรับรสชาติที่แตกต่างกัน คุณควรจะมี LoginScreen ในไดเร็กทอรีของรสชาติและนำไปใช้โดยเกี่ยวข้องกับแต่ละรสชาติตามลำดับ หรือคุณสามารถมีคลาสทั้งหมดสำหรับทั้งสองรสชาติในไดเร็กทอรีหลัก และใช้แนวทางของฉันกับ switch หรือ ifs - person NonGrate; 05.01.2017
comment
ขอบคุณเพื่อน ฉันแก้ไขมันได้แล้วโดยใช้เจตนาโดยนัย - person N J; 05.01.2017