所以我已经到了我的Android活动和片段变得有点混乱的地步。我想应用一些好的编码实践。但是,每当我想出一个好的SOLID设计时,Android就会受阻!
作为一个具体的例子,我有一个片段,允许用户更新他们的详细信息(姓名,电子邮件等)。它还允许他们拍照以用作他们的个人资料照片。
我想移动这个"拍照"编码到一个单独的界面。我们称之为PhotoTaker
。然后我想要一个名为AndroidPhotoTaker
的类,它将实现此接口以启动正确的Intent并返回所拍照片的文件名。
public interface PhotoTaker {
Uri capturePhoto();
}
public class AndroidPhotoTaker implements PhotoTaker {
private Context _context;
@Inject
public AndroidPhotoTaker(Context context) {
_context = context;
}
@Override
public Uri capturePhoto() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(_context.getPackageManager()) != null) {
File photoFile = new File("some/path/to/a/file");
Uri photoUri = FileProvider.getUriForFile(_context, _context.getApplicationContext().getPackageName() + ".provider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
_context.startActivity(takePictureIntent);
return photoUri;
}
return null;
}
}
假设通过Dagger2注入正确的上下文。
我的问题是我不能像在片段中那样调用startActivityForResult()
。因此我不再需要onActivityResult()
回调来处理结果。我唯一能找到的是_context.startActivity()
,但这看起来并不合适。
并且没有回调 - 我希望将来可以从这些意图中获得任何额外的数据。
其他人如何解决这个问题?这里的一般解决方案是什么?即人们如何抽象出具有回调的Android意图调用?
答案 0 :(得分:1)
在我看来,抽象掉calback处理使得编码远远不够复杂:你必须实现自己的 Activity-Baseclass捕获android对onActivityResult()的调用并将这些调用转发给您自定义的 您的托管活动必须实现的IOnActivityResult接口。
除此之外,您可以使用静态方法创建一个帮助器类,以创建和分析Intents。
public class MyPhotoTakerClientActivity extends Activity {
private void onTakePhotoClicked() {
Intent takePictureIntent = PhotoTakerHelper.createIntent("some/path/where/to/store/the/resultfile.jpg");
if (PhotoTakerHelper.canProcess(this, takePictureIntent)) {
startActivityForResult(takePictureIntent, TakePhotoID);
} else {
... error processing
}
}
protected void onActivityResult(final int requestCode,
final int resultCode, final Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case TakePhotoID :
Uri uri = PhotoTakerHelper.getPhotoUri(intent);
showPhoto(uri);
break;
...
在我的应用中,所有活动都有一个静态方法showActivity,它接收可以从调用活动传递到子活动的所有参数:
public class FotoGalleryActivity extends Activity {
public static void showActivity(Activity context, GalleryFilterParameter filter,
QueryParameter query, int requestCode) {
Intent intent = new Intent(context, FotoGalleryActivity.class);
if (filter != null) {
intent.putExtra(EXTRA_FILTER, filter.toString());
}
if (query != null) {
intent.putExtra(EXTRA_QUERY, query.toReParseableString());
}
if (requestCode != 0) {
context.startActivityForResult(intent, requestCode);
} else {
context.startActivity(intent);
}
}
}
调用活动不需要知道参数如何传播。只需要拨打FotoGalleryActivity.showActivity(getActivity(), getFilter(), null, ID_GALLERY);