LHS
@LHS

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AndroidStudio Kotlin MainActivvity.ktで 保存したり読込でエラーになります。

解決したいこと

AndroidStudio Kotlin MainActivvity.ktで エラーになります。

etMojiに入れた文字をbtSaveボタンを押すことでHozon.txtに保存し
etLoadをボタンを押すことでHozon.txtから読みだした文字をtvMojiに表示させたいです。

発生している問題・エラー

mortar_board
Expecting an expression
Expecting an element

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

ソースコードを入力

解決したいこと

AndroidStudio Kotlin MainActivity.kt で

etMojiに入れた文字をbtSaveボタンを押すことでHozon.txtに保存し
etLoadをボタンを押すことでHozon.txtから読みだした文字をtvMojiに表示させたいです。

VBとVCで文字の編集をする程度のことしか自作したことがありません。
よろしくお願いします。

Package com.example.edittextfile

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import java.io.File

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// 親クラスのOnCreate()メソッドを呼び出す 自動作成
super.onCreate(savedInstanceState)
// 画面の設定 自動作成
setContentView(R.layout.activity_main)

    // 消去ボタンであるButtonオブジェクトを取得
    val btClear = findViewById<Button>(R.id.btClear)
    // リスナクラスのインスタンスを生成
    val listener = HelloListener()
    // 消去ボタンにリスナを設定
    btClear.setOnClickListener(listener)

    // 保存ボタンであるButtonオブジェクトを取得
    val btSave = findViewById<Button>(R.id.btSave)
    // 保存ボタンにリスナを設定
    btSave.setOnClickListener(listener)

    // 読込ボタンであるButtonオブジェクトを取得
    val btLoad = findViewById<Button>(R.id.btLoad)
    // 読込ボタンにリスナーを設定
    btLoad.setOnClickListener(listener)

    var etMioiStr:String = ""
    var tvMojiStr:String = ""

}
// ボタンをクリックしたときのリスナクラス
private inner class HelloListener : View.OnClickListener {
    override fun onClick(view: View) {
        // 文字入力欄であるEditTextオブジェクトを取得
        val etMoji = findViewById<EditText>(R.id.etMoji)
        // 文字出力欄であるTextViewオブジェクトを取得
        val tvMoji = findViewById<TextView>(R.id.tvMoji)
        
        when(view.id) {
            R.id.btSave -> {
                val fileNames = "Hozon.txt"
                // 入力された文字列を取得
                val etMojiStr = etMoji.toString()
                val text = etMoji.text.toString()
                val fileNames = "hozon.txt"
                val files = File(fileNames)
                files.writeText(text)
            }
            R.id.btLoad -> {
                val fileNamel = "Hozan.txt"
                val f = File(fileNamel)
                runCatching (
                    var tvMojiStr = f.readText
                )
                tvMoji.text = tvMoji.text
            }
            R.id.btClear -> {
                etMoji.setText("")
                tvMoji.text = ""
            }
        }
    }
}

}


### 自分で試したこと
エムレーターでの動作ができません。
0

1Answer

sharedPreferencesを使ってみてはいかがですか?

MainActivity.kt
val etMoji = findViewById<EditText>(R.id.etMoji)
val tvMoji = findViewById<TextView>(R.id.tvMoji)
val btSave = findViewById<Button>(R.id.btSave)
val btLoad = findViewById<Button>(R.id.btLoad)
val btClear = findViewById<Button>(R.id.btClear)

// sharedPreferencesを利用
val sharedPref = getSharedPreferences("sharedPref", Context.MODE_PRIVATE)

btSave.setOnClickListener {
   sharedPref.edit()
        .putString("etMoji", etMoji.text.toString())
        .apply()
}

btLoad.setOnClickListener {
   val etMojiStr = sharedPref.getString("etMoji", "")
   tvMoji.text = etMojiStr
}

btClear.setOnClickListener {
   etMoji.text.clear()
   tvMoji.text = ""
// ついでにsharedPrefからも削除したい場合
sharedPref.edit()
   .clear()
   .apply()
}

例えばこんな感じです。
実際に試してはいないので、うまく反映されるかはわかりませんが、、

0Like

Comments

  1. あと質問の仕方も考えた方がいいですね。
    不要な箇所は省いたり、誤字脱字に気をつけたり、
    今がどうなっていてどうしたいのかをはっきり書いてくださると、回答者は質問に対して回答しやすいと思いますよ。

  2. @LHS

    Questioner

    ありがとうございます。初心者で別のサイトで問題の箇所だけですと今まで動かなかったので全文をのせたこととエラーがあまりにも多かったので失礼しました。

  3. @LHS

    Questioner

    private inner class HelloListener : View.OnClickListener {
    override fun onClick(view: View) {
    の下にコピペしましたが btSave etMoji btLoad btClear tvMoji が赤くなります。

  4. 赤くなっているのは、存在しないからだと思います。
    まず大前提として、別クラスや別関数のものは使えません(例外を除いて)。
    実際に見たわけではないので確実ではありませんが、今回の場合、
    MainActivityクラスの元となっているレイアウト(R.layout.activity_main)の中からR .id .etMojiというものを扱うので、val etMoji = findViewById(R.id.etMoji)とできますが、
    HelloListenerクラスではR.layout.activity_mainを持っていないので、そもそもR .id .etMojというものもなく、etMojiを取得することができません。
    ですので、赤文字表示になっているかと思います。

    私が載せたコードを

    .kt
    class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    // 親クラスのOnCreate()メソッドを呼び出す 自動作成
    super.onCreate(savedInstanceState)
    // 画面の設定 自動作成
    setContentView(R.layout.activity_main)
    
    // ここ
    
    }
    

    ここにコピペすれば、HelloListenerクラスを使わなくても正常に動くかと思います。(上記のコードと私書いたコード以外は不要)
    どのサイトを見ながら作ったかはわかりませんが、方法は1つだけじゃないので、自分がわかる方法で動かしていくのが良いかと思います。自分の方法はもっと調べながら見つけていきましょう。

    私のコードがどのようになっているのかは調べないと、コピペしても意味がありません(身にならない)ので、
    コピペして動作確認できたら、一つずつ調べていきましょう。
    サイトだけでなく参考書や、今ではChatGPTがあるのでそれらを活用するのもいいと思います!

Your answer might help someone💌