質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

972閲覧

ギャラリーやカメラを起動する共通クラスの作成方法(startActivityForResultの使い方)がわからない

NasuAppDev

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2020/09/13 01:35

<やりたいこと>
・ImageView内をタップするとギャラリーから選択するか写真を撮るかをDialogで表示します。
・ギャラリーを選んだ場合、ギャラリー画面を表示して選ばれた写真をImageView内に表示します。
・写真を選んだ場合、カメラを起動し、撮影・保存すると撮った写真をImageView内に表示します。

これを1つの共通クラスにして、2つのActivityから呼び出したい。

<出来たこと>
〇 FragmentおよびActivity内に以下をコーディングして、動作することは確認

Java

1--Fragment 2public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 3 ImageView iv_picture = frgGrowthloghd.findViewById(R.id.relativelayout_picture) ; 4 iv_picture .setOnClickListener(new View.OnClickListener() { 5 @Override 6 public void onClick(View v) { 7 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) ; 8 builder.setItems(new CharSequence[]{"ギャラリーから選択する", "写真を撮る", "キャンセル")}, new DialogInterface.OnClickListener() { 9 @Override 10 public void onClick(DialogInterface dialog, int which) { 11 if( which == 0 ) { 12 // ギャラリーを表示する 13 Intent intent = new Intent() ; 14 intent.setAction(Intent.ACTION_GET_CONTENT) ; 15 intent.setType("image/*") ; 16 startActivityForResult(intent, REQUEST_GALLERY); 17 } 18 else if( which == 1 ) { 19 // カメラの使用許可を確認する 20 if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 21 // カメラ使用の許可を得る 22 ActivityCompat.requestPermissions(getActivity(), new String[] {Manifest.permission.CAMERA}, REQUEST_GRANTED_CAMEARA_CODE); 23 } 24 else { 25 // カメラを起動する 26 Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE) ; 27 if(intentCamera.resolveActivity(getActivity().getPackageManager()) != null) { 28 startActivityForResult(intentCamera, REQUEST_CAMERA); 29 } 30 } 31 } 32 else { 33 // 元の画面に戻る 34 } 35 } 36 }) ; 37 // ダイアログボックスを生成して表示する 38 AlertDialog alertDialog = builder.create() ; 39 alertDialog.show() ; 40 } 41 }); 42} 43 44@Override 45public void onActivityResult(int requestCode, int resultCode, Intent data) { 46 super.onActivityResult(requestCode, resultCode, data); 47 48 // 写真を撮った後 49 if (requestCode == REQUEST_GALLERY) { 50 } 51 52 // 写真を撮った後 53 if (requestCode == REQUEST_CAMERA) { 54 } 55} 56

<困っていること>
-- Fragment部分のコードを共通クラス化して、2つのFragmentから呼び出したい。
ただ、「startActivityForResult」はComponentActivityかFragmentをextendsしないと使用できないようで、クラス内から呼び出すことが出来ない。

同じコードを2つのFragmentに記述するのは保守性の観点からいかがなものかと思い、共通化を検討しています。
いい方法が思い浮かばず、お知恵を拝借したく。
そもそも、出来ないことであれば2つのFragmentに同じコードを記述したいと思います。

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2つの Fragment に共通部分のクリックリスナをメンバに持つ BaseFragment を継承させる事で、ある程度共通化が可能かと思います。

YourBaseFragment.java

public class YourBaseFragment extends Fragment { // member public final static int REQUEST_GALLERY = 0; public final static int REQUEST_CAMERA = 1; public final View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { // クリック時の動作を記述 } }; }

YourFragment.java

public class YourFragment extends YourBaseFragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ImageView iv_picture = frgGrowthloghd.findViewById(R.id.relativelayout_picture); iv_picture.setOnClickListener(listener) } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 写真を撮った後 if (requestCode == REQUEST_GALLERY) { } // 写真を撮った後 if (requestCode == REQUEST_CAMERA) { } } }

投稿2020/09/13 14:06

編集2020/09/13 14:33
doughnut

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NasuAppDev

2020/09/14 09:03

ご教示頂きまして、ありがとうございます。 やりたいことが出来るようになりました。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問