3

Activity.findViewById()raw を返すEVERY のキャスト演算子を書くのにうんざりしているので、最終的に Internet で提案された 1 つの方法をView試しました。

public abstract class MyActivity extends Activity {

    @SuppressWarnings("unchecked")
    protected <T extends View> T findViewByID(int id) {
        return (T) this.findViewById(id);
    }
}

これはオーバーロードされていないことに注意してください(最後の「D」は大文字です)。Viewコンパイラは、にキャストできないと言いTます。私の実装に問題はありますか?奇妙なことに、この提案は英語の Web サイトではほとんど見られず (たとえば、すばらしい Stack Overflow でも)、上記のサイトは例外でした。

4

3 に答える 3

4

これは私のテストプロジェクトではうまくいきます。コンパイラ エラーなし: スクリーンショット

于 2012-07-11T13:38:52.680 に答える
2

正直なところ、このアプローチでは、次の Android メンテナー (キャスト アプローチに慣れている人) がコード ファイル内の数文字を節約するために、若干の複雑なオーバーヘッドが追加されます。

ビューを従来の方法でキャストするか、 Roboguiceのような反射ベースのソリューションを選択することを提案します。

于 2012-07-11T13:54:48.500 に答える
0

各レイアウトファイルの参照を含むクラスを生成するカスタム eclipse-builder を使用してこれを解決しました。理由は次のとおりです。

  • タイプセーフで使いやすい
  • RoboGuice および他のすべてのリフレクション ベースの API は、Android では非常に低速です。

私の意見では、これがこの問題を解決する最もクリーンでパフォーマンスの高い方法です。

ビルダーについては、こちらの要点を参照してください: https://gist.github.com/fab1an/10533872

レイアウト: test.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/text1" />

    <ScrollView
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="350px"
        android:layout_below="@id/text2"
        android:layout_marginTop="50px" />

</merge>

使用法: TestView.java

public final class TestView extends RelativeLayout {

    //~ Constructors ---------------------------------------------------------------------------------------------------
    private final ViewRef_test v;

    public TestView(final Context context) {
        super(context);

        LayoutInflater.from(context).inflate(R.layout.test, this, true);
        this.v = ViewRef_test.create(this);

        this.v.text1.setText();
        this.v.scroll.doSomething();
    }
}

生成されたファイル (内gen/): ViewRef_test.java

package org.somecompany.somepackage;

import android.view.*;
import android.widget.*;
import java.lang.String;


@SuppressWarnings("unused")
public final class ViewRef_test {

    public final TextView text1;
    public final TextView text2;
    public final ScrollView scroll;


    private ViewRef_test(View root) {
        this.text1 = (TextView) root.findViewById(R.id.text1);
        this.text2 = (TextView) root.findViewById(R.id.text2);
        this.scroll = (ScrollView) root.findViewById(R.id.scroll);
    }

    public static ViewRef_test create(View root) {
        return new ViewRef_test(root);
    }


}
于 2014-04-12T12:50:46.950 に答える