Cara mengimpor satu kelas dari ragam build lainnya [duplikat]

Struktur proyek saya terlihat seperti di bawah ini

+ 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

Saya memiliki kelas Login di main/src tergantung kondisi, harus meluncurkan layar dari rasa1 atau rasa2.

Misalnya:

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

Dalam hal ini, jika saya membuat build untuk flavour1, kesalahan untuk kelas falvor2 akan ditampilkan dan sebaliknya.

Kedua varian tersebut memiliki applicationId yang berbeda seperti applicationIdSuffix ".flavor1"

Apakah ini mungkin? Jika tidak, bagaimana saya bisa mencapai ini?


person N J    schedule 05.01.2017    source sumber
comment
jika Anda harus meluncurkan, katakanlah UserScreen, masukkan UserScreen.java di kedua versi dan masukkan implementasi masing-masing di sana. Kemudian panggil saja dari LoginScreen Anda   -  person gitter    schedule 05.01.2017
comment
Mengapa Anda tidak mengidentifikasinya dengan menggunakan ID aplikasi? Itu unik   -  person M D    schedule 05.01.2017
comment
Apakah Anda mencoba membuka KelasA di rasa1 dan kelasB di rasa2 jika benar dan sebaliknya? Dalam hal ini, Anda harus mempertahankan kedua kelas di main dan lebih memilih memiliki kelas berbeda di kedua varian yang memutuskan layar mana yang akan diluncurkan berdasarkan nilai yang Anda berikan (yaitu apa yang dilakukan blok if).   -  person gitter    schedule 05.01.2017


Jawaban (2)


Ketika saya melakukan hal semacam ini, saya menggunakan antarmuka dan injeksi ketergantungan (saya menggunakan dagger) . Sesuatu seperti:

public interface LoginBehaviour {

    void goToNextScreen(Context context);
}

Kemudian tentukan implementasi di setiap ragam yang berisi kode untuk meluncurkan layar berikutnya. Sesuatu seperti:

public class FlavourOneLoginBehaviour implements LoginBehaviour {

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

}

Dan:

public class FlavourTwoLoginBehaviour implements LoginBehaviour {

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

}

Anda perlu menyiapkan wadah injeksi ketergantungan di setiap ragam sehingga merujuk pada implementasi lokal (ini akan bervariasi tergantung pada kerangka kerja yang Anda gunakan). Setelah Anda selesai melakukannya, Anda dapat menggunakan container di proyek utama untuk mendapatkan implementasi yang benar dari antarmuka LoginBehaviour pada waktu proses, dan Anda dapat memanggil goToNextScreen di dalamnya untuk melakukan navigasi. Injeksi ketergantungan adalah cara yang sangat berguna untuk memastikan bahwa Anda dapat menukar bagian kode Anda tanpa harus melakukan pemfaktoran ulang besar-besaran, dan sangat membantu dalam penggunaan kembali dan fleksibilitas. Semoga itu bisa membantu!

person GeordieMatt    schedule 05.01.2017
comment
Terima kasih sobat, saya telah menyelesaikannya dengan menggunakan niat implisit - person N J; 05.01.2017
comment
@GeordieMatt, Sejauh yang saya pahami, antarmuka ditempatkan di ragam utama dan setiap implementasi di ragamnya masing-masing. Namun, saya tidak dapat mengetahui cara kerja DI untuk merujuk pada implementasi lokal. Maukah Anda membagikan cuplikan kode untuk menyiapkan wadah injeksi ketergantungan di setiap ragam? - person Charan; 28.02.2018
comment
@Charan Taruhan terbaik Anda untuk itu adalah dokumentasi untuk kerangka DI Anda. Saya akan merekomendasikan aplikasi Dagger untuk Android (tautannya ada di jawaban). - person GeordieMatt; 02.03.2018

Salah satu kemungkinan untuk melakukan itu, jika Anda hanya ingin memiliki satu kelas dengan if yang memeriksa buildType/productFlavors Anda - Anda dapat mengatur nilai bidang BuildConfig di kedua buildTypes/productFlavors dengan menambahkan:

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

Dan kemudian Anda dapat menggunakannya dalam kode:

class LoginScreen {
......

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

Semoga saya sudah membantu. Semoga beruntung!

person NonGrate    schedule 05.01.2017
comment
Mencoba ini juga tetapi menunjukkan kesalahan kompilasi saat mengimpor untuk ScreenUser jika saya membuat build dengan flavour2 - person N J; 05.01.2017
comment
Bisakah Anda mempublikasikan di sini detail kesalahan kompilasi? Sayangnya, saya bahkan tidak bisa menebak, masalah apa yang mungkin ada di sana. Terima kasih! - person NonGrate; 05.01.2017
comment
Ini memberi saya kesalahan pada aktivitas impor dari pernyataan impor flavro1. Error:(17, 55) error: package com.mypackage.views.product_selection does not exist karena aktivitas ini berasal dari rasa lain - person N J; 05.01.2017
comment
Jika Anda ingin menggunakan kelas yang berbeda untuk rasa yang berbeda - Anda harus memiliki LoginScreen di direktori rasa dan diimplementasikan terkait setiap rasa secara terpisah, atau Anda dapat memiliki semua kelas untuk kedua rasa di direktori utama, dan gunakan pendekatan saya dengan _1 atau 2_ - person NonGrate; 05.01.2017
comment
Terima kasih sobat, saya telah menyelesaikannya dengan menggunakan niat implisit - person N J; 05.01.2017