web-dev-qa-db-ja.com

findViewByIdの結果をキャストする必要はありませんか?

最近、私はAndroidStudioがクラスキャストを削除するよう私に思い出させることを知りました。昔は、findViewByIdの結果をキャストする必要がありましたが、現在は必要ではありません。

FindViewByIdの結果はまだViewなので、なぜクラスをキャストする必要がないのか知りたいですか?

そのような文書が見つからないのですが、誰でも文書を見つけることができますか?

138
Eric Zhao

API 26以降、findViewByIdは戻り型に推論を使用するため、キャストする必要はなくなりました。

古い定義:

View findViewById(int id)

新しい定義

<T extends View> T findViewById(int id)

それであなたのcompileSdkが少なくとも26なら、それはあなたがこれを利用できることを意味します:)

215
Eduard B.

この記事 によると

次の関数は、手動キャストの必要性を排除するために、Javaの総称自動型推論に依存しています。

protected <T extends View> T findViewById(@IdRes int id) {
    return (T) getRootView().findViewById(id);
}
13
zeroDivider

古いバージョンでは:

AutoCompleteTextView name = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);

SDK 26を搭載したAndroid Studio 3.0から:

AutoCompleteTextView name = findViewById(R.id.autoCompleteTextView);
11
Midhun

表示のようなViewクラスの一般的な属性、またはonClickのような一般的なメソッドを使用する場合、Android Studioはキャストを削除するように通知します。 ()

例えば:

((ImageView) findViewById(R.id.image_car)).setVisibility(View.VISIBLE);

この場合、あなたは単に書くことができます:

findViewById(R.id.image_car).setVisibility(View.VISIBLE);
1
Tim

Android 0、キャスティングをクリーンアップ

IO 2017でGoogleが発表したことの1つは、「キャストアウェイ」と呼ばれるものです:)。 Android開発者はfindViewById()のために手動でキャストする必要はありません。たとえば、findViewById()を使用してテキストビューを取得するための古い方法は、次のようになります。

TextView txtDesc = (TextView) findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

新しい方法はこのようになりますが

TextView txtDesc = findViewById(R.id.textViewDesc);
txtDesc.setText(getString(R.string.info_angkot_description));

それは簡単な変更です。しかし、熟練したプログラマーにとっては、このようなきれいなコードはあなたを非常に満足させることができ、それはあなたのコーディングムードに役立ちます:)

これを可能にするためには、あなたのプロジェクトbuild.gradleであなたのプロジェクトでコンパイルされたsdkのバージョンをバージョン26に設定することだけが必要でした。

あなたはまだ以前のsdkバージョンもターゲットにすることができます、それでそれは邪魔にならない変更です。

さて、本当の問題は、キャストを使っている古いコードをどうやってきれいにするかです。特に何百ものアクティビティファイルが好きなときは。あなたはそれを手動ですることができるか、あるいはそれをするためにインターンを雇うことができますか?しかし幸いなことに、これらのインターン全員にとって、Androidスタジオはすでにこれを手助けする用意ができています。

あなたがキャレットを置くと(または冗長キャスティングをクリックすると)、Androidスタジオは冗長キャスティングを処理する2つのオプションを提案します。

最初に、その余分なキャストを削除することをお勧めします。または、クリーンアップコードを選択できます。それはそのファイルのためのすべての冗長なキャストを削除します。これはもっといいのですが、もっと欲しいのです。各ファイルを開いて、これを1つずつクリーンアップするのは望ましくありません。

IntelliJのアイデアを特別なものにしているものの1つは、インテントアクションと呼ばれる機能です。あなたがしなければならないのは、Ctrl + Shift + Aを押してからcleanと入力するだけです。そして、[コードのクリーンアップ]アクションを選択し、プロジェクトの範囲全体を選択します。このいくつかの簡単な手順で、コードはずっときれいになります。

重要な点の1つは、これを何らかのコードバージョン管理システムで行うことです。これにより、インテントアクションによって加えられた変更を比較し、必要なファイルを元に戻すことができます。

元の記事からコピーしたもの:

https://medium.com/@abangkis/Android-0-clean-up-casting-c30acec56cef

0
daliaessam