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

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

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

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

1275閲覧

android studioでViewの型変換について

noko123

総合スコア28

Java

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2020/09/05 04:04

編集2020/09/05 05:25

WebViewの終了時の処理を書いています。

override fun onDestroy() { super.onDestroy() if (myWebView != null) { myWebView.stopLoading() myWebView.webViewClient = null myWebView.destroy() } myWebView = null }

とすると、最後のnullを代入するところで「val cannot be reassigned」と出ました。参考にしたコードはjavaで、findViewByIdを使ってmyWebViewにWebViewを設定していました。私はkotlinでIdを直接参照しています。原因は、javaは変数のnull許容型で、kotlinではViewは定数で非null型だからなのかなと思い、

override fun onDestroy() { super.onDestroy() if (myWebView != null) { myWebView.stopLoading() myWebView.webViewClient = null myWebView.destroy() } var a:WebView?=myWebView a = null }

としてみたのですが、これできちんと型変換できていますか?ViewのIDを使って型変換したことがないので、初歩的な質問になってしまうかもしれませんがよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

kotlin

1class XXXX { 2 // val myWebView: WebView? 3 var myWebView: WebView? // var にする 4 5 override fun onDestroy() { 6 super.onDestroy() 7 if (myWebView != null) { 8 myWebView.stopLoading() 9 myWebView.webViewClient = null 10 myWebView.destroy() 11 } 12 myWebView = null 13 } 14}

ことが多分やりたいことかと思いました

var a:WebView?=myWebView a = null

では anull になりますが、 myWebView には WebView が入ったままかと思います

追記

そもそも null クリアは不要だと思っていて

override fun onDestroy() { super.onDestroy() // if (myWebView != null) { // myWebView.stopLoading() // myWebView.webViewClient = null // myWebView.destroy() // } // myWebView = null }

だと思います。(もしメモリリークしている等あるのであれば、原因は他にあると思います。

投稿2020/09/05 07:00

編集2020/09/05 07:48
unhappychoice

総合スコア1531

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

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

noko123

2020/09/05 07:12

ご回答ありがとうございます。ということは、最初にfindViewByIdを使って変数のnull許容型を準備してやるしか方法はないでしょうか?そうすると至る所でnullチェックが必要となってしまうので、最後に型変換する方法を探していたのですが、何か良い方法をご存じないでしょうか? よろしくお願いします。
unhappychoice

2020/09/05 07:42

val は二度と再代入しないという印なので、nullを代入するのであれば var を使うしか無いです。 `最後に型変換する` みたいなことをするのを防いで、常に最初に入れたものであることを保証するのが val なので、矛盾しているというか、そのような方法はないと思います。 質問の内容とそれますが、自分であれば null クリアはそもそも不要だと思うので、回答に追記します
noko123

2020/09/05 07:46

そうなんですね。回答ありがとうございました!
noko123

2020/09/05 11:15 編集

追記された回答を拝見しました。その部分については、ドットインストールの『Androidでブラウザアプリを作ろう』という講座の中で、「webView なのですが、わりとメモリ管理がシビアと言われていて、アクティビティを終わらせる時に、色々後処理をしなくてはいけないと言われているので、そのあたりもやっておきましょう。」とあった部分なのですが、それはどうとらえればいいのでしょうか?情報が古いのか、それともjavaかkotlinかの違いによるものなのか。はたまた別の理由なのか。その部分について意見をいただけると幸いです。
unhappychoice

2020/09/05 11:22 編集

> webView なのですが、わりとメモリ管理がシビアと言われていて、アクティビティを終わらせる時に、色々後処理をしなくてはいけないと言われているので、そのあたりもやっておきましょう。 のようなまた聞きのまた聞きのような情報は多分信用する必要はなくて、Java なので基本はしっかり GC される / Activity は持っているViewの終了処理を行う ものと考えて良いと思います。 WebView がメモリを多く消費してなにか問題を起こすとしても、それは基本的には WebView の問題であって、そのような問題は Android フレームワークの責任として日々改善されています。 (ので、情報が古いというのはある意味そうだと思います そのため、このようなハックなコードは - 実際に今古いデバイス等で問題が起きていて - しかもこのコードを追加することでそれが改善する のを自身で確認した場合のみ書く、位の温度感でいるべきだという意見です。
noko123

2020/09/05 11:47 編集

ありがとうございます。大手のプログラミング学習サイトであるからと、盲目的になっていたことが分かりました。というかそれ以前に、最終更新日が2015年の情報を鵜呑みにした自分の姿勢に一番問題があったということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問