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

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

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

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

Android

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

Q&A

解決済

2回答

438閲覧

registerforactivityresult関数内処理について

tenshoku_junbi

総合スコア8

Java

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

Android

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

0グッド

0クリップ

投稿2024/10/02 14:01

https://engawapg.net/android/123/get-image-using-android-standard-gallery/

javaで開発をしています。
上記サイトの標準ギャラリーを実装するため、javaの文法に書き換えているところです。(最下部にコードを載せています。)
registerForActivityResult関数内でエラーが出ています。

-以下疑問
・imageViewについてImageViewの書き間違えと考えていますがこの考えは間違いですか。(サイトでは宣言されていません。cannot resolve symbol のエラーが出たため私のコードではfindviewbyidを使用してimageViewを使用しました。)
・ActivityResultContracts.OpenDocument()に「call method expected」のエラーがあり ソフトの指示の通りnewをインサートしましたが、「'registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O>, androidx.activity.result.ActivityResultCallback<O>)' in 'androidx.activity.ComponentActivity' cannot be applied to '(androidx.activity.result.contract.ActivityResultContracts.OpenDocument, void)'」と別のエラーが出ています。解決方法がわからず迷っています。

import androidx.activity.EdgeToEdge;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import android.widget.ImageView;
import android.net.Uri;
import androidx.activity.result.contract.ActivityResultContract;

public class SubActivity2 extends AppCompatActivity {
final ImageView imageview=findViewById(R.id.imageView);
Uri uri;
private final int launcher
= registerForActivityResult( ActivityResultContracts.OpenDocument(),
uri);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_sub2);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
}

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

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

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

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

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

guest

回答2

0

ベストアンサー

1つ目の質問:

・imageViewについてImageViewの書き間違えと考えていますがこの考えは間違いですか。(サイトでは宣言されていません。cannot resolve symbol のエラーが出たため私のコードではfindviewbyidを使用してimageViewを使用しました。)

書き間違えではありません。参考にされた記事のオリジナルのKotlinのコードは正しいものです。これは「Kotlin Android Extensions plugin」によってImageViewやButton等のビューの参照が簡単になるようになっています。実際、参考にされているオリジナルのgithub上のプロジェクトは現在の最新のAndroid Studioでビルドが可能で、ちゃんと動作します。

もうちょっと詳しくなるKotlin Android ExtensionsでのView Binding - Qiita

尚、同等の機能は現在は「View Binding」と言うものに置換され、それを使うように推奨されています。

Migrate from Kotlin synthetics to Jetpack view binding - Android Developers
※上記記事は英語のものですが、一応日本語のものもあります。翻訳され過ぎてワケ分からない部分が多い印象なので、注意してください。
Kotlin 合成から Jetpack ビュー バインディングに移行する

2つ目の質問:

・ActivityResultContracts.OpenDocument()に「call method expected」のエラーがあり ソフトの指示の通りnewをインサートしましたが、「'registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O>, androidx.activity.result.ActivityResultCallback<O>)' in 'androidx.activity.ComponentActivity' cannot be applied to '(androidx.activity.result.contract.ActivityResultContracts.OpenDocument, void)'」と別のエラーが出ています。解決方法がわからず迷っています。

まずは以下の記事の内容をよく理解する必要があると思います。

アクティビティの結果を取得する - Android Developers

で、それを踏まえた上でオリジナルのKotlinのコードをJavaに置き換えるとすると、例えば以下のようになります。

Java

1package com.example.test4; 2 3import android.net.Uri; 4import android.os.Bundle; 5import android.view.View; 6import android.widget.Button; 7import android.widget.ImageView; 8 9import androidx.activity.result.ActivityResultCallback; 10import androidx.activity.result.ActivityResultLauncher; 11import androidx.appcompat.app.AppCompatActivity; 12import androidx.activity.result.contract.ActivityResultContracts; 13 14public class MainActivity extends AppCompatActivity { 15 16 ActivityResultLauncher<String[]> mLauncher = registerForActivityResult( 17 new ActivityResultContracts.OpenDocument(), 18 new ActivityResultCallback<Uri>() { 19 @Override 20 public void onActivityResult(Uri uri) { 21 // Handle the returned Uri 22 ImageView imageView = (ImageView) findViewById(R.id.imageView); 23 imageView.setImageURI(uri); 24 } 25 }); 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.activity_main); 31 32 Button button = (Button) findViewById(R.id.button); 33 button.setOnClickListener(new View.OnClickListener() { 34 @Override 35 public void onClick(View v) { 36 mLauncher.launch(new String[]{"image/*"}); 37 } 38 }); 39 } 40} 41

以下の動作環境で確認しました。

  • ビルド: Android Studio Koala Feature Drop (2024.1.2 Patch 1)
  • エミュレーター: Pixel 2 API 30

イメージ説明


追記:
尚、私の挙げたJavaのコードではフィールドmLauncherにはfinalを付けていませんでしたが、参考にしたAndroid Developersの公式の記事がfinalを使わない例であり、それをそのまま利用しただけです。質問者さんのコードにて後で変更しないならfinalを付けて良いと思います。参考にされたオリジナルのKotlinのコードではvalなので、finalと同等です。

投稿2024/10/03 04:30

編集2024/10/03 05:14
dodox86

総合スコア9237

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

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

tenshoku_junbi

2024/10/03 14:44

丁寧に説明いただきありがとうございました。 実際に動作確認までしていただいてありがとうございました。 理解できていない点がみつかりました。 大変参考になりました。
guest

0

registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O>, androidx.activity.result.ActivityResultCallback<O>)

registerForActivityResult( ActivityResultContracts.OpenDocument(), uri);

に適用できないと読めます
引数が異なるのではないでしょうか
オーバーロードないしオーバーライドされたメソッドはありますか?

あと、Uriが初期化されていない点も気になります

Uri uri; private final int launcher = registerForActivityResult( ActivityResultContracts.OpenDocument(), uri);

あとよく読んだらこれはフィールド宣言ですね
このような初期化はコンストラクタ内で行いましょう

投稿2024/10/02 23:45

編集2024/10/02 23:58
Manabu

総合スコア44

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

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

dodox86

2024/10/03 04:38

> あとよく読んだらこれはフィールド宣言ですね > このような初期化はコンストラクタ内で行いましょう これは意図的なもので、そうしておいた方が安全な部分のようです。 https://developer.android.com/training/basics/intents/result?hl=ja#java から引用: > registerForActivityResult() は、フラグメントまたはアクティビティが作成される前に安全に呼び出すことができ、返される ActivityResultLauncher インスタンスのメンバー変数を宣言する際に直接使用できます。 Activityのコンストラクタはアプリのユーザーコードからは操作しないのが通例なので、フィールドの宣言と同時に初期化するのは仕方ないですね。
tenshoku_junbi

2024/10/03 14:59

どうやら記述にミスがあったようです。 フィールド宣言位置の指摘も参考になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問