0

新人として、inflate() のいくつかの基本を理解するのに再び苦労しています。

これが私のxmlファイルです-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity" 
   android:id="@+id/linearlayout"
   android:orientation="vertical">

 <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/hello_world"
   android:id="@+id/textview" />

</LinearLayout>

以下は基本的なコードです -

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    LinearLayout ly = (LinearLayout)findViewById(R.id.linearlayout);

    Log.i("System.out ","linear layout = " + ly);

    View view=getLayoutInflater().inflate(R.layout.activity_main,null);

    LinearLayout ly1 = (LinearLayout)findViewById(R.id.linearlayout);

    Log.i("System.out ","linear layout = " + view);
    Log.i("System.out ","linear layout = " + ly1);      
}

そして出力:

05-10 14:30:33.446: I/System.out(26806): linear layout = android.widget.LinearLayout@41e28848

05-10 14:30:33.446: I/System.out(26806): linear layout = android.widget.LinearLayout@41e29740

05-10 14:30:33.446: I/System.out(26806): linear layout = android.widget.LinearLayout@41e28848

出力の 1 行目と 3 行目から、呼び出すsetContentView()と膨張するため、このメソッドの呼び出し後にビュー オブジェクトがメモリ内にあることがわかります。したがって、 を呼び出すとfindViewById()、コード ブロックで両方の時間で linearlayout View の同じオブジェクトが返されます。(ly は ly1 に等しい)

しかし、出力の2行目でLinearLayoutオブジェクトのアドレスが違うのはなぜ linear layout = android.widget.LinearLayout@41e29740 でしょうか?

これを担当するコードは -

View view=getLayoutInflater().inflate(R.layout.activity_main,null);

これでルート ビューが返されると思いました。この場合は LinearLayout です。

すでに膨張していて、レイアウトに変更がない場合R.layout.activity_main(View/ViewGroup の追加も削除もしていない)、オブジェクトのアドレス (view & ly1) が一致しないのはなぜですか?

私はこれを試しました -

View view=getLayoutInflater().inflate(R.layout.activity_main,null);
setContentView(view); 
LinearLayout ly1 = (LinearLayout)findViewById(R.id.linearlayout); 
Log.i("System.out ","linear layout = " + view); 
Log.i("System.out ","linear layout = " + ly1);

そしてこれを得た -

I/System.out(2603): linear layout = android.widget.LinearLayout@41e09e10

I/System.out(2603): linear layout = android.widget.LinearLayout@41e09e10

この場合、ly1 とビュー オブジェクトが同じアドレスを表すのはなぜですか?

4

6 に答える 6

1

テスト手順が無効のようです。オブジェクトを正しく比較していないためです。おそらく、次のly1ように取得する必要があります。

LinearLayout ly1 = (LinearLayout)view.findViewById(R.id.linearlayout);

と同じログ出力が返されるはずですview

とにかく、ビューを膨張させると新しいオブジェクトが返され、setContentViewで定義されたビューと同じになる方法はありません。

于 2013-05-10T09:32:31.490 に答える
1

View inflate(int resource, ViewGroup root)膨張した階層のルート ビューを返します。root が指定されている場合、これはルート ビューです。それ以外の場合は、インフレートされた XML ファイルのルートです。

于 2014-05-13T13:24:49.967 に答える
0

setContentView(R.layout.activity_main); があるので 同じビュー階層 ly で (R.id.linearlayout) を参照し、同じ LinearLayout に初期化された ly1 を参照します。明確化のために@laaltoに感謝します

     View view=getLayoutInflater().inflate(R.layout.activity_main,null);

public View inflate (int リソース、ViewGroup ルート)

指定された xml リソースから新しいビュー階層をインフレートします。エラーが発生した場合は InflateException をスローします。

パラメーター

   resource ID for an XML layout resource to load (e.g., R.layout.main_page)

   root Optional view to be the parent of the generated hierarchy.

戻り値

膨張した階層のルート ビュー。root が指定されている場合、これはルート ビューです。それ以外の場合は、インフレートされた XML ファイルのルートです。

getLayoutInflater().inflate(R.layout.activity_main,null); 新しいビュー オブジェクトを返します。

于 2013-05-10T09:43:26.997 に答える
0

2行目は、レイアウト自体ではなく、ビューのメモリ方向を返していると思います。

それらは異なるものです。

あなたは物事を誤解していると思います。「View -> ViewGroup -> Layout」という一般的なスキームに従って、階層があります。

1 つは、ViewGroup -> LayoutView を含む View (アクティビティの親) を参照することです。もう 1 つは、View -> ViewGroup の子である LayoutView を参照することです。

したがって、それらは別々に保存された異なるものであり、View は LayoutView を指すと考えられます。

それが2行目の説明です。

1 行目と 3 行目は同じオブジェクトとして定義されているため、同じ方向を示しています。

于 2013-05-10T09:38:26.530 に答える