Ad esempio, supponiamo che la mia app abbia 3 passaggi con 3 pagine:
Passaggio 1: MainActivity: scegli il colore
Passaggio2:EditTextActivity:inputtext
Passaggio3:GreenActivity:mostracoloreetestodiinput
InEditTextActivity,qualeattivitàandaredopoaverpremutoNextdipendedallaprecedenteMainActivity,quindiscrivouncasoswitchperfarlo:
MainActivity:
publicclassMainActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.setTitle("Step 1");
}
public void redTheme(View view){
Intent i=new Intent(this,EditTextActivity.class);
i.putExtra("callbackId",0);
this.startActivity(i);
}
public void greenTheme(View view){
Intent i=new Intent(this,EditTextActivity.class);
i.putExtra("callbackId",1);
this.startActivity(i);
}
//similar for BlueActivity
.
.
.
}
EditTextActivity:
public class EditTextActivity extends AppCompatActivity {
public int callbackId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_text);
this.setTitle("Step 2");
this.callbackId=this.getIntent().getIntExtra("callbackId",0);
}
public void next(View view){
switch (this.callbackId){
case 0: {
Intent i2 = new Intent(this, RedActivity.class);
EditText editText = (EditText) this.findViewById(R.id.editText);
i2.putExtra("text", editText.getText().toString());
this.startActivity(i2);
break;
}
case 1: {
Intent i2 = new Intent(this, GreenActivity.class);
EditText editText = (EditText) this.findViewById(R.id.editText);
i2.putExtra("text", editText.getText().toString());
this.startActivity(i2);
break;
}
//similar for BlueActivity
.
.
.
}
}
}
Ma penso che sia un incubo di mantenimento: quando aggiungo una nuova attività di colore, ad es. YellowActivity, ho bisogno di modificare sia MainActivity che EditTextActivity e quindi aggiungere una nuova opzione switch. Vorrei che la logica del pulsante Avanti fosse posizionata in MainActivity e quindi utilizzo il mio meccanismo di callback:
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.setTitle("Step 1");
}
public void redTheme(View view){
Intent i=new Intent(this,EditTextActivity.class);
final EditTextActivity.Callback callback= new EditTextActivity.Callback() {
@Override
public void run(EditTextActivity editTextActivity) {
Intent i2=new Intent(editTextActivity,RedActivity.class);
EditText editText=(EditText)editTextActivity.findViewById(R.id.editText);
i2.putExtra("text",editText.getText().toString());
editTextActivity.startActivity(i2);
EditTextActivity.callbackMap.remove(editTextActivity.callbackId);
}
};
int hashCode=callback.hashCode();
EditTextActivity.callbackMap.put(hashCode,callback);
i.putExtra("callbackId",hashCode);
this.startActivity(i);
}
public void greenTheme(View view){
Intent i=new Intent(this,EditTextActivity.class);
final EditTextActivity.Callback callback= new EditTextActivity.Callback() {
@Override
public void run(EditTextActivity editTextActivity) {
Intent i2=new Intent(editTextActivity,GreenActivity.class);
EditText editText=(EditText)editTextActivity.findViewById(R.id.editText);
i2.putExtra("text",editText.getText().toString());
editTextActivity.startActivity(i2);
EditTextActivity.callbackMap.remove(editTextActivity.callbackId);
}
};
int hashCode=callback.hashCode();
EditTextActivity.callbackMap.put(hashCode,callback);
i.putExtra("callbackId",hashCode);
this.startActivity(i);
}
//similar for BlueActivity
.
.
.
}
EditTextActivity:
public class EditTextActivity extends AppCompatActivity {
public interface Callback{
public void run(EditTextActivity editTextActivity);
}
public static Map<Integer,Callback> callbackMap=new HashMap<>();
public int callbackId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_text);
this.setTitle("Step 2");
this.callbackId=this.getIntent().getIntExtra("callbackId",0);
}
public void buttonPressed(View view){
callbackMap.get(this.callbackId).run(this);
}
}
Che uso una mappa statica per contenere i callback anziché incorporati nel caso di switch, e ora posso aggiungere una nuova operazione del pulsante Next senza modificare EditTextActivity.
Tuttavia, ho trovato che questo meccanismo è molto più complicato di quello originale:
- Contiene più codici
- Il nuovo approccio è meno diretto di quello originale, che temo che i miei compagni di squadra non riescano a capire cosa sto cercando di fare.
- Il modo standard in molti documenti sembra solo utilizzare il caso switch
Quindi la mia domanda è: dovrei eliminare il caso switch in questo caso?
Nota: sto chiedendo l'approccio generale di passare funzioni o callback all'attività successiva, non specifico per questo caso. Quindi non dare suggerimenti come "passare la stringa di colore su EditTextActivity".