Androidパフォーマンスの最適化:ViewStub

2809 ワード

アプリケーションを開発するとき、実行時に条件に応じてどのViewやレイアウトを表示するかを動的に決定することがよくあります.最も一般的な考えは、使用可能なViewをすべて上に書いて、まずそれらの可視性をViewに設定することです.GONEは、コード内で可視性を動的に変更します.このようなやり方の利点は、論理が簡単で、制御が柔軟であることです.しかし、その欠点は資源を消費することです.ビューの初期を表示しますがただし、GONEはInflateレイアウトの場合、ViewはInflate、つまりオブジェクトが作成され、インスタンス化され、プロパティが設定されます.つまり、メモリなどのリソースが消費されます.
おすすめの方法はAndroidを使うことです.view.ViewStub、ViewStubは軽量レベルのViewで、リソースを占有する非常に小さなコントロールです.Inflateレイアウトでは、ViewStubのみが初期化され、ViewStubが表示に設定(デフォルトでは非表示)、またはViewStubが呼び出される.inflate()の場合、ViewStubのレイアウトはInflateとインスタンス化されます.
しかし、ViewStubも万能ではありません.次に、ViewStubができることと、いつViewStubを使うべきか、いつ可視性のコントロールを使うべきかをまとめます.
まず、ViewStubの特徴についてお話しします.
(1)ViewStubは1回のみInflateでき,その後はViewStubオブジェクトが空になる.つまり、ViewStubによって指定されたレイアウトがInflateされると、ViewStubで制御することはできません.
(2)ViewStubは、特定のViewではなくInflateのレイアウトファイルにのみ使用できます.もちろん、Viewをレイアウトファイルに書くこともできます.
   
以上の特徴に基づいて、ViewStubを使用することが考えられます.
(1)プログラムの実行中に、再起動しない限り、あるレイアウトはInflate後に変更されません.
ViewStubは一度しかInflateできないので、その後は空にされるので、後でViewStubを使ってレイアウトを制御することは期待できません.したがって、実行時にレイアウトを一度以上表示および非表示にする必要がある場合は、ViewStubはできません.このときはViewでコントロールするしかありません.
(2)表示と非表示を制御したいのは,あるビューではなくレイアウトファイルである.
ViewStubに設定されているのは、レイアウトファイルのIdのみなので、Viewを制御することはできません.
   
したがって、ButtonやTextViewなどのViewの表示と非表示を制御したり、実行時にレイアウトやViewを表示したり非表示にしたりするには、Viewを使用して制御するしかありません.
 
次に例を見てみましょう
この例では、2つの異なるレイアウトを表示します.1つはTextViewで文字を表示し、もう1つはImageViewで画像を表示します.どちらを表示するかはonCreate()のときに決めますが、ここではViewStubを適用するのに最適な場所です.
まずレイアウトを見てみましょう.1つはメインレイアウトで、中には2つのViewStubしか定義されていません.1つはTextViewを制御するために使用され、1つはImageViewを制御するために使用され、もう1つは文字を表示するために作成されたTextViewレイアウトで、1つはImageViewのために作成されたレイアウトです.
  
 1    2    8       16       23 

 
 1 // ... 2     @Override  
 3     public void onCreate(Bundle savedInstanceState) {  
 4         super.onCreate(savedInstanceState);  
 5         setContentView(R.layout.viewstub_demo_activity);  
 6         if ((((int) (Math.random() * 100)) & 0x01) == 0) {  
 7             ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_text); //      8             stub.inflate(); //     9   10             TextView text = (TextView) findViewById(R.id.viewstub_demo_textview);  
11             text.setText("Hello World");  
12         } else {  
13             ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_p_w_picpath);  
14             stub.inflate();15 16             ImageView p_w_picpath = (ImageView) findViewById(R.id.viewstub_demo_p_w_picpathview);  
17             p_w_picpath.setImageResource(R.drawable.img);  
18         }  
19     }20 //  ...

 
また、新しいコンテンツや新しい機能のヒントのようなものもあります.一度しか表示されず、変化しないViewStubが適しています.