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

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

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

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

5324閲覧

Javaで書かれたコードをAndroidStudioのKotlin自動翻訳にかけるとエラーになるのでJavaをKotlinに翻訳する方法が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/03/03 20:25

編集2020/03/03 20:26

前提・実現したいこと

ToDoアプリをKotlinで作成したくて、以下の記事を参考にしており、大変わかりやすいのですが、layout以外のプログラムがJavaで書かれており、AndroidStudioのKotlin自動翻訳にかけると、エラーだらけになってしまい、Javaで書かれたコードをKotlinにする方法を探しています。

Firebaseの設定は問題なくできています。

Kotlinの資料はまだ少ないこともあり、どうにかしてJavaで書かれたコードをKotlinにしたいのですが、自動翻訳でも全体的にエラーが出る場合、どうすればいいでしょうか。

【Android】Firebaseを利用したToDoアプリ開発

公開されているgithubレポジトリ

発生している問題・エラーメッセージ

このように、赤くエラーに染まる部分が多すぎて、Kotlinのコードで似た部分のあるものは、試したことに明記したように一部修正しましたが、今回実行したいプロジェクトでは

  • AddActivity.java
  • CustomAdapter.java
  • LoginActivity.java
  • MainActivity.java
  • ToDoActivity.java
  • ToDoData.java

という6つのJavaプログラムがあり、これを全てJavaからKotlinにするだけの十分な知識がなく、自動翻訳ではエラーが出るので、困っています。
イメージ説明

該当のソースコード

元々Javaで書かれたもの(文字数の関係で、質問に掲載することができませんでしたので、githubのURLを掲載します)
MainActivity.java

自動翻訳でJavaからKotlinにされたもの
MainActivity.kt

kotlin

1import android.app.AlertDialog; 2import android.content.Intent; 3import android.os.Bundle; 4import android.support.annotation.NonNull; 5import android.support.v7.app.AppCompatActivity; 6import android.text.TextUtils; 7import android.util.Log; 8import android.view.View; 9import android.widget.EditText; 10import android.widget.Toast; 11 12import com.google.android.gms.tasks.OnCompleteListener; 13import com.google.android.gms.tasks.Task; 14import com.google.firebase.auth.AuthResult; 15import com.google.firebase.auth.FirebaseAuth; 16 17public class MainActivity extends AppCompatActivity { 18 EditText emailFormEditText, passwordFormEditText; 19 public Intent data; 20 public FirebaseAuth mAuth; 21 private static final String TAG = "EmailPassword"; 22 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.activity_main); 27 28 emailFormEditText = (EditText) findViewById(R.id.email_log_in_edit_text); 29 passwordFormEditText = (EditText) findViewById(R.id.password_log_in_edit_text); 30 31 mAuth = FirebaseAuth.getInstance(); 32 } 33 34 public boolean checkEmpty() { 35 if (TextUtils.isEmpty(emailFormEditText.getText())) { 36 Log.d("MainActivity", "何も記入されていません"); 37 return false; 38 } 39 40 if (TextUtils.isEmpty(passwordFormEditText.getText())) { 41 Log.d("MainActivity", "何も記入されていません"); 42 return false; 43 } 44 return true; 45 } 46 47 public void loginMailButton(View v) { 48 signIn(emailFormEditText.getText().toString(), passwordFormEditText.getText().toString()); 49 setResult(RESULT_OK, data); 50 } 51 52 public void addMailButton(View v) { 53 createAccount(emailFormEditText.getText().toString(), passwordFormEditText.getText().toString()); 54 setResult(RESULT_OK, data); 55 } 56 57 private void createAccount(String email, String password) { 58 Log.d(TAG, "createAccount:" + email); 59 60 if (!checkEmpty()) { 61 return; 62 } 63 64 mAuth.createUserWithEmailAndPassword(email, password) 65 .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 66 @Override 67 public void onComplete(@NonNull Task<AuthResult> task) { 68 if (task.isSuccessful()) { 69 // ログインに成功したら、ログインしたユーザーの情報でUIを更新します。 70 Log.d(TAG, "createUserWithEmail:success"); 71 Toast.makeText(MainActivity.this, "新規作成に成功しました!", Toast.LENGTH_SHORT).show(); 72 changeActivity(); 73 } else { 74 // サインインに失敗した場合は、ユーザーにメッセージを表示します。 75 Log.w(TAG, "createUserWithEmail:failure", task.getException()); 76 Toast.makeText(MainActivity.this, "Authentication failed.", 77 Toast.LENGTH_SHORT).show(); 78 } 79 80 } 81 }); 82 } 83 84 private void signIn(String email, String password) { 85 Log.d(TAG, "signIn:" + email); 86 87 if (!checkEmpty()) { 88 return; 89 } 90 91 mAuth.signInWithEmailAndPassword(email, password) 92 .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 93 @Override 94 public void onComplete(@NonNull Task<AuthResult> task) { 95 if (task.isSuccessful()) { 96 // ログインに成功したら、ログインしたユーザーの情報でUIを更新します。 97 Log.d(TAG, "signInWithEmail:success"); 98 Toast.makeText(MainActivity.this, "ログインに成功しました!", Toast.LENGTH_SHORT).show(); 99 changeActivity(); 100 } else { 101 // サインインに失敗した場合は、ユーザーにメッセージを表示します。 102 Log.w(TAG, "signInWithEmail:failure", task.getException()); 103 104 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 105 builder.setMessage(task.getException().getMessage()) 106 .setTitle("Error!") 107 .setPositiveButton(android.R.string.ok, null); 108 AlertDialog dialog = builder.create(); 109 dialog.show(); 110 } 111 112 } 113 }); 114 } 115 116 private void changeActivity() { 117 Intent intent = new Intent(this, ToDoActivity.class); 118 startActivity(intent); 119 finish(); 120 } 121 122}

試したこと

Kotlinのコードで共通の部分は一部直しましたが、初見でJavaで書かれたコードはどのようにKotlinにすればいいのでしょうか。

kotlin

1class MainActivity : AppCompatActivity() { 2 EditText emailFormEditText, passwordFormEditText; 3 public Intent data; 4 public FirebaseAuth mAuth; 5 private static final String TAG = "EmailPassword"; 6 7 override fun onCreate(savedInstanceState: Bundle?) { 8 super.onCreate(savedInstanceState) 9 setContentView(R.layout.activity_main) 10 11 emailFormEditText = (EditText) findViewById(R.id.email_log_in_edit_text); 12 passwordFormEditText = (EditText) findViewById(R.id.password_log_in_edit_text); 13 14 mAuth = FirebaseAuth.getInstance(); 15 }

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

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

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

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

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

m.ts10806

2020/03/03 21:30

回答依頼いただきましたが、Javaは分かるんですが、Kotlinについては未経験なのでお応えできません。 質問のメインとなるタグのスコアは気にされた方が無駄うちにならなくて済むと思います。
hoshi-takanori

2020/03/03 22:02

Java から自動翻訳しても自然な Kotlin コードにはならないし、Java と Kotlin は共存できると思うので、勉強のために自分で少しずつ Kotlin で書き直すか、最初から Kotlin で書かれたものを探すのがいいと思います。
退会済みユーザー

退会済みユーザー

2020/03/03 23:05

ソースをどう見てもJavaのままなのですが…自動翻訳の手順などはあっていますか?
shiketa

2020/03/04 00:29 編集

自動翻訳って、IntelliJ(AndroidStudio)の"Convert Java file to Kotlin file"メニューのことでしょうかね。 変換できるJavaソースもありますが、もちろん完璧ではないでしょうし、不自然な結果となることもあるでしょうし、苦手な部分もあるでしょう(なんとなくの体感ですが、ラムダ式は苦手そうかなと)。自分の理解できるJavaソースをKotlinに変換して、あーなるほどこう書くのか、という勉強にはいいと思いますが、既存のなにかをまるっと変換するのはどうかな、とおもいます。 hoshi-takanoriさんも書かれていますが、Java <-> Kotlinは相互運用可能です。Kotlinで書いて納めろ、という要求なら仕方ないでしょうが、Kotlin/Javaを混在させながら、徐々にKotlinに移行するのがいいとおもいます。 Kotlin導入を目論むならまずはテストソースから、というのはあちらこちらで書かれていますし。
guest

回答1

0

ベストアンサー

Javaソースファイルのみで構成されているAndroidプロジェクトのJavaソースコードをKotlinソースコードに変換したい場合、2つの段階を踏む必要があります。

AndroidプロジェクトでKotlinソースファイルを扱うためには、専用のプラグインが導入されている必要があります。素のプロジェクトにはそれらが導入されていないため、メニューでConvert Java File to Kotlin Fileを選ぶと、まずはそのプラグインを導入してKotlinが扱えるプロジェクトに変換するかどうかを下図のようなダイアログで問われます。

ダイアログ1

これでOKを選択して、次に出てくる対象モジュールやKotlinバージョンを問うダイアログが出てきます。特に必要がなければそのままOKすれば良いはずです。

ダイアログ2

これが完了した段階で、初めて個別のJavaソースファイルをKotlinソースファイルに変換する操作ができるようになります。この後、変換したいソースファイルをツリー状から選んで、メニューからConvert Java File to Kotlin Fileを選択することで、Kotlinソースコードへの変換が行われるでしょう。ただし、変換ではエレガントなKotlinソースコードにはなりませんので、自ら手作業で修正を加えていく必要はあります。

質問の画像やご提示の変換結果はどうも見てもおかしく、単純にファイルのリネームを行っただけではないのか?と思えます。Android Studio上の操作でファイルの拡張子をjavaからktに変えてしまうことは可能ですが、それでは変換したことにはなりません。


(回答追記)

コピーペーストでktファイルにJavaのソースコードを貼り付けることで変換を行うとき、下図のようなダイアログが出るはずですが、それは確認されていますか?

ダイアログ3

前述したように、Kotlinソースコードを扱うためにはKotlinが扱えるプロジェクトになっている必要があります。そうなっていないプロジェクト上で拡張子ktのファイルを作ってJavaソースコードを貼り付けても変換は実行されません。そういう状況になっているものと推察しています。

私の手元で、確実に「Kotlinが扱えるプロジェクト」となっているプロジェクト上に用意したKotlinソースファイルに、リンク先にあったMainActivity.javaのソースファイルをコピーペーストしたら、下図のように変換されました。(import文部分省略)

kotlin

1class MainActivity : AppCompatActivity() { 2 var emailFormEditText: EditText? = null 3 var passwordFormEditText: EditText? = null 4 var data: Intent? = null 5 var mAuth: FirebaseAuth? = null 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 setContentView(R.layout.activity_main) 9 emailFormEditText = findViewById<View>(R.id.email_log_in_edit_text) as EditText 10 passwordFormEditText = findViewById<View>(R.id.password_log_in_edit_text) as EditText 11 mAuth = FirebaseAuth.getInstance() 12 } 13 14 fun checkEmpty(): Boolean { 15 if (TextUtils.isEmpty(emailFormEditText!!.text)) { 16 Log.d("MainActivity", "何も記入されていません") 17 return false 18 } 19 if (TextUtils.isEmpty(passwordFormEditText!!.text)) { 20 Log.d("MainActivity", "何も記入されていません") 21 return false 22 } 23 return true 24 } 25 26 fun loginMailButton(v: View?) { 27 signIn(emailFormEditText!!.text.toString(), passwordFormEditText!!.text.toString()) 28 setResult(Activity.RESULT_OK, data) 29 } 30 31 fun addMailButton(v: View?) { 32 createAccount(emailFormEditText!!.text.toString(), passwordFormEditText!!.text.toString()) 33 setResult(Activity.RESULT_OK, data) 34 } 35 36 private fun createAccount(email: String, password: String) { 37 Log.d(TAG, "createAccount:$email") 38 if (!checkEmpty()) { 39 return 40 } 41 mAuth.createUserWithEmailAndPassword(email, password) 42 .addOnCompleteListener(this, object : OnCompleteListener<AuthResult?>() { 43 fun onComplete(task: Task<AuthResult?>) { 44 if (task.isSuccessful()) { 45 // ログインに成功したら、ログインしたユーザーの情報でUIを更新します。 46 Log.d(TAG, "createUserWithEmail:success") 47 Toast.makeText(this@MainActivity, "新規作成に成功しました!", Toast.LENGTH_SHORT).show() 48 changeActivity() 49 } else { 50 // サインインに失敗した場合は、ユーザーにメッセージを表示します。 51 Log.w(TAG, "createUserWithEmail:failure", task.getException()) 52 Toast.makeText(this@MainActivity, "Authentication failed.", 53 Toast.LENGTH_SHORT).show() 54 } 55 } 56 }) 57 } 58 59 private fun signIn(email: String, password: String) { 60 Log.d(TAG, "signIn:$email") 61 if (!checkEmpty()) { 62 return 63 } 64 mAuth.signInWithEmailAndPassword(email, password) 65 .addOnCompleteListener(this, object : OnCompleteListener<AuthResult?>() { 66 fun onComplete(task: Task<AuthResult?>) { 67 if (task.isSuccessful()) { 68 // ログインに成功したら、ログインしたユーザーの情報でUIを更新します。 69 Log.d(TAG, "signInWithEmail:success") 70 Toast.makeText(this@MainActivity, "ログインに成功しました!", Toast.LENGTH_SHORT).show() 71 changeActivity() 72 } else { 73 // サインインに失敗した場合は、ユーザーにメッセージを表示します。 74 Log.w(TAG, "signInWithEmail:failure", task.getException()) 75 val builder: AlertDialog.Builder = Builder(this@MainActivity) 76 builder.setMessage(task.getException().getMessage()) 77 .setTitle("Error!") 78 .setPositiveButton(R.string.ok, null) 79 val dialog: AlertDialog = builder.create() 80 dialog.show() 81 } 82 } 83 }) 84 } 85 86 private fun changeActivity() { 87 val intent = Intent(this, ToDoActivity::class.java) 88 startActivity(intent) 89 finish() 90 } 91 92 companion object { 93 private const val TAG = "EmailPassword" 94 } 95}

質問でご提示いただいたJavaソースコードがそのまま貼り付けられてしまったプロジェクトのbuild.gradle (Module: app)を開いたとき、

gradle

1apply plugin: 'com.android.application' 2apply plugin: 'kotlin-android' 3apply plugin: 'kotlin-android-extensions' 4 5(中略) 6 7dependencies { 8(中略) 9 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 10(中略) 11}

のように、Kotlinのプラグインやライブラリーを利用するような記述が確認できるでしょうか?

投稿2020/03/04 14:17

編集2020/03/06 13:50
keicha_hrs

総合スコア6766

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

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

退会済みユーザー

退会済みユーザー

2020/03/05 13:40

ご回答いただきましてありがとうございます。今回のJavaのコードをKotlinファイルを選択して、AndroidStudioに貼り付けると、自動変換されたものでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問