4

私は、フィールドと小さなアクティビティのonCreate()メソッドを汚染する山をきれいにする賢い方法を開発するために一生懸命努力してBlah blah = (Blah) this.findViewById(R.id.blah)います。そうするために、setContentView()ではなくgetViewInflate()。inflateを使用する必要があると感じています。 ()XMLで定義されたすべてのビュー。

ソータはActivity.setContentView()シンタックスシュガーであり、getViewInflate().inflate()XMLのすべてのビューで事実上繰り返されていますか?私は彼らが同じであるかのように言っている何かを読みました。

コードを調べて答えが得られたら、教えてください。Activity.classを確認しましたが、コメントしか見つかりませんでした。

4

3 に答える 3

2

アクティビティのsetContentViewは、実際には、アクティビティで使用されるウィンドウのsetContentViewを呼び出します。これは、レイアウトを拡張するだけではありません。

できることは、反射を使用してビューをクラスフィールドにマップすることです。これを行うユーティリティクラスをGithubにダウンロードできます。

レイアウトで宣言されているすべてのビューを解析してから、R.idクラスのidに対応する名前を見つけようとします。次に、ターゲットオブジェクトで同じ名前のフィールドを検索し、対応するビューで設定しようとします。

たとえば、このようなレイアウトがある場合

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

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

アクティビティのtextView1フィールドに自動的にマップされます。

于 2012-07-11T10:25:20.327 に答える
2

私は自分の貧弱な研究を投稿しています。要約すると、その中で呼び出されるActivity.setContentView()デリゲートPhoneWindow.setContentView()(の唯一の具体的なクラスWindow)は、「 == 」LayoutInflater.inflate()と言ってもそれほどオフではないと思います。setContentView()ViewInflate().inflate()

public class Activity extends ContextThemeWrapper{

    private Window mWindow;

    public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
        initActionBar();
    }

    public Window getWindow() {
        return mWindow;
    }
}



public class PhoneWindow extends Window {

    private LayoutInflater mLayoutInflater;

    @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        **mLayoutInflater.inflate(layoutResID, mContentParent);**
        final Callback cb = getCallback();
        if (cb != null) {
            cb.onContentChanged();
        }
    }
}
于 2012-07-12T11:05:56.513 に答える
0

実際、あなたは正しいです。同じことを達成するための2つの方法があります。

1)setContentView(R.layout.layout);

2)

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = inflater.inflate(R.layout.layout, null);
setContentView(v);

あなたはあなたにとってより適切なものを決定します。お役に立てれば。

于 2012-07-11T09:59:14.350 に答える