1

アプリケーションのすべての TextView にカスタム書体を設定できるように、LayoutInflater の Factory インターフェイスを使用しています。残念ながら、私のアプリケーションには機能しない場所があります。調査の結果、たとえば、ListView のアダプターでは、セルを膨張させるために使用される LayoutInflater が、アプリケーションの残りの部分で使用されているものとは異なるようです (私のアクティビティはフラグメントを含む複雑な構造を持っています)。

この動作は正常ですか? 取得方法に関係なく、同じ LayoutInflater が常に使用されるようにするにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

LayoutInflaterfromへの参照を取得するのでContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)(ViewGroup.inflateそしてActivity.getLayoutInflater単なる便利なラッパーです)、それが破棄されて再作成されるまで、常に同じインフレータ サービスへの参照を返し、その後、新しく作成されたこのサービスが返されるなどと仮定します...そのマネージャーを想定していますgetSystemService メソッドから取得されるオブジェクトは、「通常の」サービスのバインダー オブジェクトと同様です。

編集:そして、私が間違っていたと言っている;)

ソースコードと android.view.ContextThemeWrapper (アクティビティのスーパークラス) をチェックアウトしました:

 @Override public Object  getSystemService(String name) {
     if (LAYOUT_INFLATER_SERVICE.equals(name)) {
         if (mInflater == null) {
             mInflater = LayoutInflater.from(mBase).cloneInContext(this);
         }
         return mInflater;
     }
     return mBase.getSystemService(name);
 }

そして、おそらく mBase Context 実装である android.app.ContextImpl で:

public Object getSystemService(String name) {
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
    return fetcher == null ? null : fetcher.getService(this);
}

where : プライベート スタティック 最終 HashMap SYSTEM_SERVICE_MAP = new HashMap();

ServiceFetcher は、「システム サービス インスタンス」をキャッシュおよび取得するための内部クラスです。

activity/ContextWrapper ごとに 1 つの LayoutInflater があることは確かです。より多くの観測研究ソースについては、どうぞ;)

于 2012-06-04T22:06:28.733 に答える
0

LayoutInflaters の数はそれほど重要ではないと思います (文字通り数千人でない限り)。しかし、はい、複数のインフレータを使用することは確かに正常です。アダプター ビューを操作するときにかなりの数を使用します (静的ビューは 1 つも使用しません。各アダプターは 1 つしか使用しません)。

アダプターが機能しないコード内の場所がある場合は、おそらく何かが不足しています。インフレータが機能しないコードを投稿します。

于 2012-06-04T21:52:05.163 に答える