Sto provando a creare una semplice app che ha 2 attività, che inseriscono il testo in un'attività e poi la visualizza sulla barra del titolo se un'altra attività:
EditTextActivity:
MainActivity:
SocheilmodostandardperimplementarloèutilizzarestartActivityForResult:
publicclassEditTextActivityextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_text_view);}publicvoidbuttonPressed(Viewview){Intentintent=newIntent();Intent.putExtra("result", ((EditText)this.findViewById(R.id.editText)).getEditableText().toString());
this.setResult(0,intent);
finish();
}
}
-
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.startActivityForResult(new Intent(this,EditTextActivity.class),0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
this.setTitle(data.getExtras().getString("result"));
}
}
ma penso che questo meccanismo non sia conveniente: se ho più startActivityForResult, il mio onActivityResult sarebbe molto lungo. Inoltre ha una scarsa leggibilità perché la logica per gestire il risultato è all'interno diActivityResult, che è molto lontano da startActivityForResult.
Attualmente Android non può inserire oggetti (callback) nell'intento, quindi cerco di implementare il mio meccanismo di richiamo callback: che apre una mappa statica per memorizzare il callback da un'altra attività:
public class EditTextActivity extends AppCompatActivity {
public static HashMap<Integer,Callback> callbackMap=new HashMap<>();
public static void startActivity(AppCompatActivity activity,Callback callback){
//add callback
int activityObjectId=System.identityHashCode(activity);
callbackMap.put(activityObjectId,callback);
Intent intent=new Intent(activity,EditTextActivity.class);
intent.putExtra("activityObjectId",System.identityHashCode(activity));
activity.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_view);
}
public void buttonPressed(View view){
int activityObjectId=this.getIntent().getIntExtra("activityObjectId",0);
//remove callback callbackMap.get(activityObjectId).onActivityResult(((EditText)this.findViewById(R.id.editText)).getEditableText().toString());
callbackMap.remove(activityObjectId);
finish();
}
public interface Callback{
void onActivityResult(String s);
}
}
quindi avvolgere il codice suActivityResult in un oggetto e quindi inserirlo nella mappa prima di startActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditTextFragment.startActivity(this,R.id.rootView, new EditTextFragment.Callback() {
@Override
public void onActivityResult(String s) {
MainActivity.this.setTitle(s);
}
});
}
}
Ho intenzione di implementare questo meccanismo di callback (se possibile) in attività, frammenti e altri componenti che richiedono in seguito il callback handler come metodo standard, perché penso che mi permetta di usare un modo unico per implementare i callback, è una buona idea farlo?