私は、カメラの意図から写真ファイルを提供するタスクを持つコンポーネントを作成する必要があります。 これまで、私は結果のための別のアクティビティを開始してそれを待って、活動中のそれらのことをしました。 しかし、ここでは、UIレイヤ(アクティビティ)へのアクセスがないビジネスロジックレイヤーからそのコンポーネントを使用したいと考えています。 これらの要件を満たすコンポーネントを作成するにはどうすればよいですか?結果のインテントを開始する必要がある場合、コンポーネントをアクティビティから分離する方法は?
0
A
答えて
2
は、カスタムで
Application
クラスはインスタンスApp
クラスの静的ゲッターを作成してcontext
利用できるようにします。public class App extends Application { private static App instance; @Override public void onCreate() { instance = this; } public static App getInstance(){ return instance; } }
あなたは依存性の注入を使用している場合、私は強く、それによって
App
クラスを提供お勧めします。コンポーネントで実行可能な操作を記述するコンポーネント用のインターフェイスを作成します。ここでは、関数
takePhoto()
と、の2つの別の関数を追加します。とは、リスナーを削除します。PhotoTakerListener
からPhotoTakerComponent
のpublic interface PhotoTakerComponent { void takePhoto(); void addListener(PhotoTakerListener listener); void removeListener(PhotoTakerListener listener); }
実装は、リスナーにより、当社のbiusness層のクラスと通信します。
public interface PhotoTakerListener { void onPhotoTaken(Boolean success, String path); }
PhotoTakerActivity
を作成します。このアクティビティはレイアウトのないコンポーネント内部クラスになります。正しい意図を開始するためにのみ開始し、onActivityResult
メソッドで再呼び出しを待ちます。結局のところ、これは即座に終了します。レイアウトを膨らませないため、このアクティビティは表示されません。takePhoto()
方法では、我々は内部PhotoTakerActivity
を始めるところ我々はPhotoTakerComponent
インタフェースの実装を作成する必要があり、最後のステップでpublic class PhotoTakerActivity extends AppCompatActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... Uri uri = Uri.parse(mFileName); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, **uri**); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, RequestImageCapture); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RequestImageCapture) { if (resultCode == RESULT_CANCELED){ for (PhotoTakerListener listener: listeners) { listener.onPhotoTaken(false, null); } } else if (resultCode == RESULT_OK){ for (PhotoTakerListener listener: listeners){ listener.onPhotoTaken(true, mFileName); } } } finish(); } }
。
public class DefaultPhotoTakerComponent implements PhotoTakerComponent { private Context mApplicationContext; public DefaultPhotoTakerComponent() { mApplicationContext = App.getInstance().getApplicationContext(); } @Override public void takePhoto() { if (mApplicationContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { try { ... Intent intent = new Intent(mApplicationContext, PhotoTakerActivity.class); intent.putExtra(PhotoTakerActivity.ExtraFileName, Uri.fromFile(image).toString()); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mApplicationContext.startActivity(intent); } catch (IOException e) { e.printStackTrace(); } } } public void addListener(PhotoTakerListener listener){ PhotoTakerActivity.addListener(listener); } public void removeListener(PhotoTakerListener listener){ PhotoTakerActivity.removeListener(listener); } }
サンプル・アプリケーションは、Githubの上で提供されています:Here とC#
Xamarin.Android用:Here
Java
Android用
関連する問題
- 1. IMEからの結果のアクティビティ開始
- 2. この場合、TextInputを分離コンポーネントにする方法
- 3. インテントからアクティビティを開始しない
- 4. アクティビティでフラグメントを開始する方法変数で保留中のインテントから
- 5. 他のアクティビティから特定のインテントでアクティビティを開始する方法 - OnNewIntentから
- 6. 結果の開始アクティビティがnullポインタ例外を取得する
- 7. 設定の結果のアクティビティを開始
- 8. インテントからアクティビティを呼び出すときにアクティビティを再開する方法
- 9. On ClickListenerからインテントを開始する
- 10. Android 2.3.3 |アクティビティを開始するインテントを区別する
- 11. Android:サービス内で新しいスレッドを開始する方法(結果を自分のアクティビティに返す)
- 12. APIとインプリメンテーションの分離は合計する必要がありますか?
- 13. MenuItemインテントまたはonOptionsItemSelectedのアクティビティを開始するタイミング
- 14. Androidインテントまたはバックラウンドなしでアクティビティを開始する方法
- 15. アクティビティを開始し、非活動デセンダントクラスから結果を取得する
- 16. アクティビティを開始せずに余分なインテントでデータを送信することはありますか?
- 17. COMコンポーネントを分離する方法.Net
- 18. クラッシュした場合、別のインテントを開始しようとすると、インテントが始まります。
- 19. 「トランザクションレベルを設定する」に開始トランザクションが必要ですか?私は、ストアドプロシージャに「SETトランザクション分離レベルを」使用している場合はMS SQL Serverので
- 20. インテントが開始しないフラグメントからのアクティビティ
- 21. actvityのRecyclerViewからアクティビティを開始する方法
- 22. 他のアクティビティからフラグメントを開始する方法
- 23. Marshal :: GetFunctionPointerForDelegate:その結果を公開する必要がありますか?
- 24. onListItemClickを介してListFragmentからアクティビティを開始する方法
- 25. CMakeList.txtをソースフォルダから分離する必要がありますか?
- 26. クリックした場所から新しいアクティビティを開始する方法
- 27. アクティビティを拡張できないパッケージからインテントを開始する
- 28. XMLファイルから1つの結果を分離する
- 29. アクティビティをインテントで開始した後にアプリに戻る方法は?
- 30. 新しいアクティビティを開始し、そのアクティビティでメソッドを開始する方法